使用MVVM Light Messenger与Silverlight 4 ChildWindow对话框类

10
问候!很高兴使用MVVM Light - 伟大的框架 - 它使我的生活变得更加轻松,消除了一些难以克服的障碍...
问题:
我正在尝试为编辑用户相互发送的消息设置自定义对话框框。我正在尝试使用MVVM框架构建silverlight自定义对话框框,使用ChildWindow对象。
想知道如何完成这个任务是否有任何建议
遵循此处找到的对话框MVVM示例代码:http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338 我被卡住了,因为Silverlight中的ChildWindow对话框对象是异步的,并且具有不同的Result类。
所以 - 我现在的基本想法是使用该类的视图模型(在这种情况下为Matrix.MessageViewModel)来创建自定义对话框框的实例,将其通过Messenger.Send<>发送,处理在视图中注册的消息以显示对话框,然后让ChildWindow对话框框的Save按钮处理程序触发一个带有修改内容的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

这与我所做的几乎一样,但有几点不同之处:

  1. 我会为我的对话框视图创建一个视图模型,并将消息逻辑移动到其中,而不是在视图的代码后面。
  2. 我会在我的视图模型中使用保存命令,并将ButtonSave绑定到该命令。这将把保存逻辑移到视图模型中,而不是在视图的代码后面。
  3. 当单击保存按钮时,您正在使用不同的消息。此外,您没有使用DialogMessage的回调。假设您改用Save命令,您可以将消息保存在视图模型中的私有成员中,然后在用户保存时使用消息的回调。
  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();
    }
}

太好了,谢谢!我已经让原始方法运行起来了,但是会重构成你的方法 - 我认为你的建议将解决我遇到的其他一些问题... - Mike Morley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接