2012-11-06 77 views
5

关于MVVM模式的问题,我认为我错了。将对象传递给viewmodel

当触下事件的看法我想弹出一个消息,即:

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

通常,viewmodels将使用INPC接口(http://msdn.microsoft.com/zh-cn/library/system.componentmodel.inotifypropertychanged.aspx)来支持通知视图/使用者属性已更新。我强烈建议不要在代码中将datacontext重新绑定到附加在此场景中的新视图模型中。 –

+0

感谢昆顿,我了解使用INPC。我可能从字面上看这个,但这里有人点击一个视图,我想启动一个新的视图,传递一些与他们点击的点相关的数据。 –

+1

请原谅我对代码的看法,你确实在做一般认为正确的事情,它在代码中可能看起来不那么漂亮,但是实例化数据并将其传递给视图模型的标准方式,有几个MVVM框架可以帮助缓解这种情况在他们的设计中可能会引起你的兴趣,但如果你想手动处理这一切,这通常是公认的方法。 –

回答

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,这只是数据绑定,它关系到代码的正确分离。

希望将分开什么的显示(视图模型)从什么如何什么是显示(用户界面);在发起事件时,你要保持这种关注的分离。

是的,你必须编写一些代码(或者你可以通过属性通知的改变来做到这一点,但它更丑陋,坦率地说),但它保持了分离,并且允许简单的可测试性而不需要引入任何用户界面元素。