我在 Prism 中找到了这段文字文档 http://msdn.microsoft.com/en-us/library/gg405484%28v=pandp.40%29.aspx。我开始使用 MVVM,但我迷失了方向。我可以(应该)在视图中绑定模型属性吗?或者我必须为模型中的每个属性创建一个带有代理属性的视图模型?
The 模型类通常提供
财产和收藏的变化
通知事件通过
INotifyPropertyChanged 和
INotifyCollectionChanged 接口。这使他们能够轻松地获取数据
绑定在视图中。模型类
表示对象的集合
通常源自
ObservableCollection 类。
编辑:这里有一些额外的信息可以提供帮助。我正在从头开始构建一个个人项目(所以我也在设计模型),这是我第一次使用 MVVM,我想正确学习。
我的模型非常分层,具有包含更多类列表的类,其中包含更多列表,构建复杂的信息树。我正在尝试“标准”MVVM 方法,使用 POCO 构建模型,没有通知,并使用 List。然后使用适当的通知并使用 ObservableCollections 构建 ViewModel。
问题是,按照目前的情况,我几乎将整个模型重建为 ViewModel,并且必须保持 to (ObservableCollection 到列表)之间的数据同步。然后我在 Prism 文档上读到了这一点,想知道我是否应该遇到所有这些麻烦,或者只是为逻辑创建一个根 ViewModel 并将所有其余部分绑定到模型本身。
这实际上取决于,如果您的模型已经实现了 INotifyPropertyChanged 和/或 IError 信息,您可能希望将其正确绑定到模型属性。但是,如果您想要执行特殊的验证和模型一无所知的其他内容,则可以在视图模型中添加属性包装器。
本文给出了一个混合的很好的例子:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx 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;
}
}
}
(此代码可能不起作用,我只是在这里输入的。)
现在,如果您需要所有模型和所有属性的更改通知,您必须在模型中实现它或将所有属性包装在视图模型中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)