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

Mik*_*ley 10 silverlight childwindow silverlight-4.0 mvvm-light

问候!我喜欢使用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);
Run Code Online (Sandbox Code Playgroud)

视图:

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();
}
Run Code Online (Sandbox Code Playgroud)

对话保存:

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

这将绑定到ViewModel,它有一个Messenger.Default.Register <>监视CommandTypes.MessageSave,它将生成的MessageItem路由到模型进行存储.....

Mat*_*sto 8

这非常接近我所做的事情,除了有几件事我做的不同.

  1. 我的对话框视图有一个视图模型,并将消息传递逻辑移动到它而不是后面的视图代码.
  2. 我在视图模型中使用Save命令,并将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();
    }
}
Run Code Online (Sandbox Code Playgroud)