我们正在设计一个允许用户搜索和操作联系人记录的WPF / MVVM应用程序。
我们有一个MainViewModel,它包含一个可观察的ContactViewModel对象集合,每个对象都包含一个从业务层返回的Contact实体。 UI在列表中显示这些内容,其中SelectedItem属性绑定到MainViewModel上的相应SelectedContact属性。
我们还有一个按钮或其他命令绑定到MainViewModel公开的'ProcessContact'ICommand。
ProcessContact需要接受选定的联系人并对其做一些事情,这并不重要。
我的问题是:获取所选ContactViewModel包含的基础Contact对象的正确方法是什么?我可以在我的视图模型上公开Contact属性,但这意味着该视图可能直接绑定到模型之外的属性。
我发现自己经常传递ViewModel实例,当我真正想要的是它正在包装的实体时感觉不对。
我错过了一些明显的东西吗?
编辑:同事抛出的一些建议:
将实体公开为ViewModel上的受保护属性,这将阻止视图绑定到它(假设视图类位于单独的程序集中)
停止尝试完全访问该模型。如果我们想以某种方式处理底层实体,我们在ViewModel上调用一个方法。在我的示例中,我们可能在ContactViewModel上有一个.Process方法。 ('SelectedContact.Process()')
第二个选项对我来说感觉更好,但不确定我们是否应该将那么多逻辑放入ViewModel(但如果没有那么,那么在哪里?)
答案 0 :(得分:1)
你的第二个建议对我来说似乎更正确。我通常将我的数据包装在一个视图模型中,这个模型就像一个控制器......它应该控制用户在视图中的操作对数据的影响。因此,我将包装您的数据,然后将适当的行为附加到您的视图模型。我不知道为什么你会担心为你的视图模型添加太多逻辑,这就是它的工作!
答案 1 :(得分:0)
我建议在MainViewModel中有一个可观察的Contact对象集合。 Framework将自动支持实体属性的更改通知,您甚至不需要在实体中实现INotifyPropertyChanged。
如果你有任何特定的理由在viewmodel中包装你的Contact实体(我很想知道它们),你将不得不公开Contact对象(通过一个属性) 并使用它。
答案 2 :(得分:0)
不要将模型包装在ViewModel中。 Atleast不会将其作为公共财产公开。
您可以使您的Presenter成为模型的观察者,以便在模型更改时收到通知。然后, Presenter可以调用View并将其传递给ViewModel 。