10

问候!我很享受使用 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,其中包含修改后的内容,然后使用视图模型上的 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 路由到模型进行存储.....

4

1 回答 1

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();
    }
}
于 2010-07-27T12:50:48.320 回答