直接在View中绑定模型属性

时间:2011-04-27 19:14:16

标签: data-binding mvvm model prism

我在Prism documentation中找到了这个文本。我从MVVM开始,我迷路了。可以(应该)在视图中绑定模型属性,还是必须为模型中的每个属性创建一个具有代理属性的viewmodel?

  

模型类通常提供   财产和收藏品的变化   通过的通知事件   INotifyPropertyChanged和   INotifyCollectionChanged接口。   这使他们可以轻松获得数据   在视图中绑定。模型类   表示对象的集合   通常来自   ObservableCollection类。

编辑:这是一些额外的信息来帮助。我正在从头开始构建一个个人项目(所以我也在设计模型),这是我第一次使用MVVM而且我想要正确学习。

我的模型是非常层次的,具有更多类的列表,其中包含更多列表,构建复杂的信息树。我正在尝试“标准”MVVM方法,使用POCO构建模型并且没有通知,并使用List。然后使用适当的通知构建ViewModel并使用ObservableCollections。

问题是,它的方式,我几乎将我的整个模型重建为ViewModel并且必须保持数据在to(ObservableCollection到List)之间同步。然后我在Prism文档中读到了这个,并想知道我是否应该遇到所有麻烦,或者只是为逻辑创建一个根ViewModel并将所有其余部分绑定到模型本身。

1 个答案:

答案 0 :(得分:3)

实际上,如果你的模型已经实现了INotifyPropertyChanged和/或IError信息,你可能想要绑定到模型属性。但是,如果您想要进行特殊验证以及模型一无所知的其他内容,请在视图模型中添加属性包装。

本文提供了混合的一个很好的例子:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

我的MV属性通常看起来像这样,这很正常:

    public string Symbol
    {
        get { return Model.Symbol; }
        set { Model.Symbol = value; this.NotifyOfPropertyChange(() => this.Symbol); }
    }

我经常不在模型中实现INotifyPropertyChanged,因此我经常需要编写包装器。

编辑:回复您的其他信息:保持集合和列表同步可能有点棘手。在你的情况下,我要做的是为每个模型类创建一个视图模型,但不包装所有属性只是像这样访问它们:{Bindng Customer.Name}。但是,当然您必须为包含视图模型的集合创建包装器。正如他们所说,Prism文档只是指导,如果你的场景需要不同的方法,那么这很好。

看看这段代码。我只包装我将通过模型访问的集合和属性。这为您提供了两全其美的体验。然后,如果您需要一个不属于您模型的特殊属性,您可以将其添加到视图模型中(请参阅CustomerViewModel),或者如果您需要特殊通知某些属性。

class CompanyViewModel{
  public CopanyViewModel(Company c){
     foreach(var customer in c.Customers)
       Customers.Add(new CustomerViewModel(customer);
  }
  public Company Company {get;set;}
  public ObservableCollection<CustomerViewModel> Customers {get;set;}
}

class CustomerViewModel{
  public CustomerViewModel(Customer c){
     Customer = c;
  }
  public Customer Customer {get;set;}

  public Brush CustomerBackground{
     get{
        if(Customer.Active)
           return Brush.Greeen;
        else
           return Brush.Red;
     }
  }
 }

(这段代码可能不起作用,我只是在这里输入。)

现在,如果您需要更改所有模型和所有属性的通知,则必须在模型中实现它,或者在视图模型中包装所有属性。