我在Prism documentation中找到了这个文本。我从MVVM开始,我迷路了。可以(应该)在视图中绑定模型属性,还是必须为模型中的每个属性创建一个具有代理属性的viewmodel?
模型类通常提供 财产和收藏品的变化 通过的通知事件 INotifyPropertyChanged和 INotifyCollectionChanged接口。 这使他们可以轻松获得数据 在视图中绑定。模型类 表示对象的集合 通常来自 ObservableCollection类。
编辑:这是一些额外的信息来帮助。我正在从头开始构建一个个人项目(所以我也在设计模型),这是我第一次使用MVVM而且我想要正确学习。
我的模型是非常层次的,具有更多类的列表,其中包含更多列表,构建复杂的信息树。我正在尝试“标准”MVVM方法,使用POCO构建模型并且没有通知,并使用List。然后使用适当的通知构建ViewModel并使用ObservableCollections。
问题是,它的方式,我几乎将我的整个模型重建为ViewModel并且必须保持数据在to(ObservableCollection到List)之间同步。然后我在Prism文档中读到了这个,并想知道我是否应该遇到所有麻烦,或者只是为逻辑创建一个根ViewModel并将所有其余部分绑定到模型本身。
答案 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;
}
}
}
(这段代码可能不起作用,我只是在这里输入。)
现在,如果您需要更改所有模型和所有属性的通知,则必须在模型中实现它,或者在视图模型中包装所有属性。