использование MVVM light messenger с классом диалога Silverlight 4 ChildWindow - PullRequest
10 голосов
/ 27 июля 2010

Привет! Я наслаждаюсь использованием легких в использовании фреймворков MVVM - они значительно облегчили мою жизнь и сняли ряд барьеров, которые было трудно преодолеть ....

Вопрос:

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

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

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

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

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

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

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

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 Ответ

8 голосов
/ 27 июля 2010

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

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

Вот изменения, которые я внесу в модель вашего вида, следуя предложениям 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...