关于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;
}
}
这有效,但感觉不对。这是填充视图模型的可接受方式吗?
答案 0 :(得分:2)
我认为您在视图模型中创建控件时违反了MVVM。这是不可测试的,您的视图模型已现在创建控件而且不应该是测试的要求(这强调了UI与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,它是关于正确分离代码的。
您希望将所显示内容的 (视图模型)与显示内容的 how 分开(UI);在解雇事件时,你要保持关注点的分离。
是的,您必须编写一些代码(或者您可以通过更改属性通知来实现,但坦率地说,它更加丑陋),但它保持了分离并且允许轻松测试而无需引入任何用户界面元素。