假设有一个PIModel(即个人信息模型)和一个ViewModle(包含来自PIModel和其他的一些信息)。
// PIModel
public PIModel
{
private string firstName;
public string FirstName { get; set; }
private string lastName;
public string LastName { get; set; }
... // other
}
然后,FirstName属性和LastName属性需要绑定到View,所以我有两个问题:
我了解该实现不推荐使用模型中的INotifyPropertyChanged
。
答案 0 :(得分:1)
如果您的模型是自我通知,则没有问题。您可以实施模型INotifyPropertyChanged
。这是msdn文章,它将澄清你对模型实现的所有疑虑以及如果你的模型没有实现INPC的解决方法。
http://msdn.microsoft.com/en-us/library/gg405484%28PandP.40%29.aspx
因此,如果您的模型不属于可以实现INotifyPropertyChanged
的类别(例如,数据库自动生成的实体),那么您将必须在VM中的模型属性上编写包装器属性。
但坦率地说,如果你能实施INPC,你应该避免不必要的重复和维护代码。
答案 1 :(得分:1)
在练习MVVM几年后,即使它不是100%符合MSDN标准,我也会稍微有点麻烦。
我非常同意这个重新命名:不要在模型中实现INotifyPropertyChanged。
我会解释原因:如果你的模型只是属性和INotifyPropertyChanged,那么它在责任方面的作用是什么? (想想单一责任原则:http://en.wikipedia.org/wiki/Single_responsibility_principle)
让我们举个例子:如果您在PIModel中使用INotifyPropertyChanged,那么PIModel的作用是将您的数据呈现给您的视图。顺便说一句,ViewModel在MSDN定义中的作用是什么?你得到了它:将你的数据呈现给你的观点。
所以最后,如果你同时使用Model和ViewModel来呈现你的数据,每个组件的角色都会模糊,你会有一些想法,“好吧,我想在这里我甚至不需要ViewModel”。 数据表示责任将设置在不同的概念类中。
在我的观点中,如果你有这种想法,你只需要ViewModel(但可能是一个比其他PIViewModel更大的ViewModel)。不要构建贫血模型(模型只包含属性而不负责任),因为它会使代码复杂化并且不会增加任何价值。
仅当您向对象添加其他责任时才使用模型,并且不显示责任(因为它属于ViewModel),而是真正的业务责任。
因此,如果大部分数据来自服务器,并且业务责任大部分在服务器上,那么在我的客户端应用程序中主要查看ViewModel将是合乎逻辑的。
希望它有所帮助。