我应该如何访问ViewModel的底层实体/模型

时间:2010-09-08 16:03:43

标签: .net wpf mvvm

我们正在设计一个允许用户搜索和操作联系人记录的WPF / MVVM应用程序。

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

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

ProcessContact需要接受选定的联系人并对其做一些事情,这并不重要。

我的问题是:获取所选ContactViewModel包含的基础Contact对象的正确方法是什么?我可以在我的视图模型上公开Contact属性,但这意味着该视图可能直接绑定到模型之外的属性。

我发现自己经常传递ViewModel实例,当我真正想要的是它正在包装的实体时感觉不对。

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

编辑:同事抛出的一些建议:

  • 将实体公开为ViewModel上的受保护属性,这将阻止视图绑定到它(假设视图类位于单独的程序集中)

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

第二个选项对我来说感觉更好,但不确定我们是否应该将那么多逻辑放入ViewModel(但如果没有那么,那么在哪里?)

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

如果你有任何特定的理由在viewmodel中包装你的Contact实体(我很想知道它们),你将不得不公开Contact对象(通过一个属性) 并使用它。

答案 2 :(得分:0)

不要将模型包装在ViewModel中。 Atleast不会将其作为公共财产公开。

您可以使您的Presenter成为模型的观察者,以便在模型更改时收到通知。然后, Presenter可以调用View并将其传递给ViewModel