6

关于 MVVM 模式的问题,我认为我错了。

当视图中发生触地事件时,我想弹出一条消息,即:

private void marker_TouchDown(MessageObject msgData)
{
    CustomMessageControl message = new CustomMessageControl() {Width = 610, Height = 332};
    CustomMessageViewModel messageVM = new CustomMessageViewModel(msgData);
    message.DataContext = messageVM;
    //Add to canvas
}

我的视图模型:

public class CustomMessageViewModel
{
    public MessageObject message { get; set; }

    public CustomMessageViewModel(MessageObject message)
    {
        this.MessageObject = message;
    }
}

这有效,但感觉不对。这是填充视图模型的可接受方式吗?

4

1 回答 1

2

我相信您在视图模型中创建控件时违反了 MVVM。这是不可测试的,您的视图模型现在必须创建控件,这不应该是测试的要求(这强调了 UI 和视图模型之间缺乏关注点分离)。

与其创建控件,不如让您的视图模型触发它自己的事件是完全可以接受的。在这种情况下,您将传递您希望对话框/覆盖/控件绑定到的视图模型,如下所示:

public class CustomMessageControlEventArgs : EventArgs
{
    public CustomMessageViewModel CustomMessageViewModel { get; set; }
}

public event EventHandler<CustomMessageControlEventArgs> 
    ShowCustomMessageControl;

private void marker_TouchDown(MessageObject msgData)
{
    // Create the view model.
    var message = ...;

    // Get the events.
    var events = ShowCustomMessageControl;

    // Fire.
    if (events != null) events(this, 
        new CustomMessageControlEventArgs {
            MessageObject = new CustomMessageViewModel(msgData)
        });
}

然后,在您的 UI 代码中,您将绑定到该事件,然后为该事件显示适当的用户界面。

请记住,MVVM 并不是严格意义上能够在 XAML 中声明所有内容或通过数据绑定将数据绑定到 UI,它是关于正确分离代码。

您想将显示的内容(视图模型)与显示的方式(UI)分开;在触发事件时,您将保持关注点分离。

是的,您必须在后面编写一些代码(或者您可以通过属性通知更改来完成,但坦率地说,它更丑陋),但它保持了分离并允许轻松测试,而无需引入任何用户界面元素。

于 2012-11-06T20:02:02.060 回答