我们正在设计一个允许用户搜索和操作联系人记录的WPF/MVVM应用程序。我应该如何访问ViewModel的底层实体/模型
我们有一个MainViewModel,它包含一个ContactViewModel对象的可观察集合,每个对象都包装从我们的业务层返回的Contact实体。用户界面将这些显示在列表中,SelectedItem属性绑定到MainViewModel上相应的SelectedContact属性。
我们还会有一个按钮或其他命令绑定到由MainViewModel公开的'ProcessContact'ICommand的按钮。
ProcessContact需要采用选定的联系人并对其进行处理,这并不重要。
我的问题是:获取所选ContactViewModel封装的底层Contact对象的正确方法是什么?我可以在我的视图模型上公开Contact属性,但这意味着视图可能会直接绑定到属性上。
我发现自己将ViewModel实例传递给了很多人,当我真正想要的是它正在包装的实体时,感觉不对。
我错过了一些明显的东西吗?
编辑:一对夫妇的同事拦腰抱住建议:
揭露实体的视图模型一个受保护的财产,这将阻止视图绑定到它(假定视图类是在一个单独的组装)
停止试图完全访问模型。如果我们想以某种方式处理底层实体,我们在ViewModel上调用一个方法。在我的例子中,我们可能有一个关闭ContactViewModel的.Process方法。 (“SelectedContact.Process()”)
第二个选项感觉就像一个更好的解决方案给我,但不知道是否我们应该把那么多的逻辑到视图模型(但如果不存在,又在哪里? )
如果我想绑定到,例如,联系人的姓,该怎么办。我的联系人实体不支持INotifyPropertyChanged(也不应该是POCO业务对象),但ContactViewModel *不支持*,并且可以将联系人的属性更新集中到一起,同时引发NotifyPropertyChanged。请参阅msdn上的Josh Smiths MVVM文章:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx - 将他的Customer/CustomerViewModel替换为我的Contact/CntactViewModel,您将拥有几乎相同的情况。 – 2010-09-09 07:47:24