使用MVVM light messenger和Silverlight 4 ChildWindow对话框类

时间:2010-07-27 03:04:59

标签: silverlight silverlight-4.0 mvvm-light childwindow

问候!我喜欢使用MVVM轻薄的框架 - 让我的生活变得更加轻松,并且已经消除了许多难以克服的障碍......

问题:

我正在尝试设置一个自定义对话框,用于编辑用户相互发送的消息。我正在尝试使用MVVM框架使用ChildWindow对象构造一个Silverlight自定义对话框。

想知道是否有任何关于如何实现这一目标的建议

在我找到的对话框MVVM示例代码之后:http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338我遇到了问题,因为Silverlight中的ChildWindow对话框对象是异步的,并且具有不同的Result类。

所以 - 我现在的基本思想是使用类的视图模型(在本例中为Matrix.MessageViewModel)来创建自定义对话框的实例,通过Messenger.Send<>进程发送它在视图中注册的消息显示对话框,然后让ChildWindow对话框的Save按钮处理程序触发Messenger.Send,修改后的内容然后使用viewmodel上的Save方法存储...

似乎有点圆 - 所以想确保没有更清洁的方式......

相关代码位:

查看模型:

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&lt;&gt;观察CommandTypes.MessageSave,它将生成的MessageItem路由到模型进行存储.....

1 个答案:

答案 0 :(得分:8)

这与我的工作非常接近,除了有几件事我做的不同。

  1. 我的对话框视图有一个视图模型,并将消息传递逻辑移到它而不是后面的视图代码。
  2. 我在视图模型中使用Save命令,并将ButtonSave绑定到该命令。这会将保存逻辑移动到视图模型而不是视图后面的代码。
  3. 单击“保存”按钮时,您正在使用其他消息。此外,您没有使用DialogMessage的回调。假设您更改为使用“保存”命令,则可以将消息保存在视图模型中的私有成员中,然后在用户保存时使用消息的回调。
  4. 您可能需要考虑重新使用对话框视图,或确保正确清理视图,以免最终导致内存泄漏。
  5. 以下是我根据建议2&amp ;;对视图模型所做的更改。 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();
        }
    }