将对象传递给viewmodel

时间:2012-11-06 19:21:56

标签: c# mvvm

关于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;
    }
}

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

1 个答案:

答案 0 :(得分:2)

我认为您在视图模型中创建控件时违反了MVVM。这是不可测试的,您的视图模型现在创建控件而且不应该是测试的要求(这强调了UI与U​​I之间缺乏关注点的分离)视图模型)。

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

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,它是关于正确分离代码的。

您希望将所显示内容的 (视图模型)与显示内容的 how 分开(UI);在解雇事件时,你要保持关注点的分离。

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