2010-09-08 110 views
4

我们正在设计一个允许用户搜索和操作联系人记录的WPF/MVVM应用程序。我应该如何访问ViewModel的底层实体/模型

我们有一个MainViewModel,它包含一个ContactViewModel对象的可观察集合,每个对象都包装从我们的业务层返回的Contact实体。用户界面将这些显示在列表中,SelectedItem属性绑定到MainViewModel上相应的SelectedContact属性。

我们还会有一个按钮或其他命令绑定到由MainViewModel公开的'ProcessContact'ICommand的按钮。

ProcessContact需要采用选定的联系人并对其进行处理,这并不重要。

我的问题是:获取所选ContactViewModel封装的底层Contact对象的正确方法是什么?我可以在我的视图模型上公开Contact属性,但这意味着视图可能会直接绑定到属性上。

我发现自己将ViewModel实例传递给了很多人,当我真正想要的是它正在包装的实体时,感觉不对。

我错过了一些明显的东西吗?

编辑:一对夫妇的同事拦腰抱住建议:

  • 揭露实体的视图模型一个受保护的财产,这将阻止视图绑定到它(假定视图类是在一个单独的组装)

  • 停止试图完全访问模型。如果我们想以某种方式处理底层实体,我们在ViewModel上调用一个方法。在我的例子中,我们可能有一个关闭ContactViewModel的.Process方法。 (“SelectedContact.Process()”)

第二个选项感觉就像一个更好的解决方案给我,但不知道是否我们应该把那么多的逻辑到视图模型(但如果不存在,又在哪里? )

回答

1

你的第二个建议似乎对我更正确。我通常将我的数据封装在一个视图模型中,该模型就像控制器一样......它应该控制用户在视图中的操作对数据的影响。所以我会去包装你的数据,然后将适当的行为附加到你的视图模型。我不知道为什么你会担心为视图模型添加太多的逻辑,这是它的工作!

0

我建议在您的MainViewModel中有一个可观察的Contact对象集合。框架将自动支持实体属性的更改通知,并且您甚至不需要在实体中实现INotifyPropertyChanged。

如果您有任何特定的原因将您的联系实体包装在viewmodel中(我很想知道它们),您将不得不公开联系对象(通过属性 )并使用它。

+0

如果我想绑定到,例如,联系人的姓,该怎么办。我的联系人实体不支持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

0

不要将模型包裹在ViewModel中。至少不要将其公开为公共财产。

您可以让您的演示者成为Model的观察者,以便在Model更改时得到通知。您的演示者然后可以调用视图并将其传递给ViewModel

+1

我不认为在MVVM中将模型包装在ViewModel中并不常见。请参阅msdn上的Josh Smiths文章:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx其中每个CustomerViewModel类都具有对基础Customer对象的引用)。在这种情况下,模型类只是数据的容器,并且不会暴露任何会使它们可观察的东西(属性更改通知等),这就是虚拟机在那里的原因...... – 2010-09-10 11:26:49

相关问题