使用MVVM Light Messenger与Silverlight 4 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<>观看CommandTypes.MessageSave,将生成的MessageItem路由到模型进行存储…..

解决方法

这是非常接近我会做的,除了有一些我做的不同的事情.

>我将有一个视图模型为我的对话视图,并将消息逻辑移动到它,而不是视图的代码背后.
>我将在我的视图模型中使用保存命令,并将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();
    }
}

相关文章

如何在Silverlight4(XAML)中绑定IsEnabled属性?我试过简单的...
我正在编写我的第一个vb.net应用程序(但我也会在这里标记c#,...
ProcessFile()是在UIThread上运行还是在单独的线程上运行.如...
我从同行那里听说,对sharepoint的了解对职业生涯有益.我们不...
我正在尝试保存一个类我的类对象的集合.我收到一个错误说明:...
我需要根据Silverlight中的某些配置值设置给定控件的Style.我...