在WPF中,ViewModel具有对Model的引用

时间:2013-09-12 01:32:39

标签: c# wpf mvvm model viewmodel

假设有一个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,所以我有两个问题:

  • ViewModel是否具有对PIModel实例的属性引用;
  • 如果是这样,ViewModel是否有两个属性引用PIModel.FirstName和PIModel.LastName。

我了解该实现不推荐使用模型中的INotifyPropertyChanged

2 个答案:

答案 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将是合乎逻辑的。

希望它有所帮助。