С помощью MVVM light messenger с диалоговым классом Silverlight 4 ChildWindow

Привет! Я наслаждаюсь использованием MVVM light -great framework - сделал мою жизнь намного проще и устранил ряд препятствий, которые трудно преодолеть....

Вопрос:

Я пытаюсь настроить настраиваемое диалоговое окно для редактирования сообщений, отправляемых пользователями друг другу. Я пытаюсь построить специальное диалоговое окно Silverlight, используя объект ChildWindow с использованием среды MVVM.

Интересно, были ли какие-либо предложения относительно того, как это может быть выполнено?

Следуя образцу кода MVVM диалогового окна, я нашел здесь: http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338 Я застрял, потому что диалоговое окно ChildWindow в Silverlight является асинхронным, и имеет другой класс результатов.

Итак. Основная идея, которую я сейчас имею, - использовать модель представления класса (в данном случае Matrix.MessageViewModel) для создания экземпляра настраиваемого диалогового окна, отправить его через Messenger.Send < > , обработать зарегистрированное сообщение в представлении для отображения диалогового окна, а затем диалоговое окно ChildWindow. Сохраните кнопку "Сохранить". Пропустите Messenger.Send с измененным содержимым, которое затем сохраняется с помощью метода "Сохранить" в режиме просмотра...

Кажется немного кругом - так хотелось убедиться, что не было более чистого пути....

Соответствующие биты кода:

модель просмотра:

messageDialogBox = new MessageEditorDialog(
    selectedMessage, this.SelectedSiteId,  this.LoggedOnEmployee.Id, this.Projects);

DialogMessage editMessage = new DialogMessage(
    this, messageDialogBox,"Edit Message", DialogMessageCallback);
Messenger.Default.Send(editMessage);

Вид:

public ViewHost()
{
    InitializeComponent();

    Loaded += new RoutedEventHandler(ViewHost_Loaded);

    if (!ViewModelBase.IsInDesignModeStatic)
    {
        // Use MEF To load the View Model
        CompositionInitializer.SatisfyImports(this);
    }

    ApplicationMessages.IsBusyMessage.Register(this, OnIsBusyChange);

    Messenger.Default.Register<DialogMessage>(this, msg => ShowDialog(msg));
}



private void ShowDialog(DialogMessage msg)
{
    MessageEditorDialog myDialog = (MessageEditorDialog) msg.Target;
    myDialog.Show();
}

Диалог Сохранить:

private void ButtonSave_Click(object sender, RoutedEventArgs e)
{
    Messenger.Default.Send<Message>(
        this.MessageItem, CommandMessages.MessageTypes.MessageSave);
}

Это связано с ViewModel, который имеет Messenger.Default.Register < > наблюдение за CommandTypes.MessageSave, который направляет результирующий MessageItem к модели для хранения.....

Ответ 1

Это довольно чертовски близко к тому, что я буду делать, кроме нескольких вещей, которые я делаю по-другому.

  • У меня была бы модель представления для моего диалогового окна и переместить логику обмена сообщениями, а не код представления.
  • Я бы использовал команду Save в моей модели представления и привязал ButtonSave к этой команде. Это перемещает логику сохранения в модель представления вместо кода, стоящего за вашим представлением.
  • При нажатии кнопки сохранения вы используете другое сообщение. Кроме того, вы не используете обратный вызов DialogMessage. Предполагая, что вы измените использование команды "Сохранить", вы можете сохранить сообщение в частном члене в модели представления, а затем использовать обратный вызов сообщения, когда пользователь сохраняет.
  • Возможно, вам захочется подумать о повторном использовании диалогового окна или убедиться, что представление очищено правильно, чтобы вы не закончили утечку памяти.

Вот изменения, которые я внес бы в вашу модель просмотра после предложений 2 и 3.

public class MessageEditorDialogViewModel : ViewModelBase
{
    private DialogMessage _dialogMessage;

    public RelayCommand SaveCommand { get; private set; }

    public DialogMessage Message { get; set; }

    public MessageEditorDialogViewModel()
    {
        SaveCommand = new RelayCommand(SaveCommandExecute);
    }

    private SaveCommandExecute()
    {
        Message.Execute();
    }
}