MVVM View Model的结构设计模式?

时间:2011-03-20 19:46:26

标签: mvvm design-patterns inotifypropertychanged

MVVM视图模型是否有任何推荐的结构设计模式,允许动态地将不同的状态和功能添加到基础对象,但仍然在所有相关属性上维护INotifyPropertyChanged?像装饰模式,但mvvm准备好了吗?

2 个答案:

答案 0 :(得分:2)

是。 WPF绑定系统将使用custom type descriptor在运行时与ViewModel的属性进行交互。我以前用过这个来在KeyValueCollection< T>中创建密钥。在集合中显示为属性。

这有两个重要的好处。它简化了绑定:

DataContext.SomeCollectionProperty[SomeKey]可以简化为DataContext.SomeCollectionProperty.SomeKey,如果您为数据上下文创建自定义类型描述符,DataContext.SomeKey就像它获得的一样简单。

它修复了我认为的错误 - 即使属性为null,也会呈现格式字符串。使用CTD,您可以跳过null(和DBNull)属性,确保在属性不存在时不会呈现格式字符串:

想象一下,你有一个double?,你必须以美元金额呈现。如果您使用以下绑定:{Binding Price, FormatString='Price: {0:c}'}且价格为空,则会在您的UI中获得以下内容:Price: $。这很难看。但是,如果Price是您的UI上基于PropertyDescriptor的属性,则当Price为null时,您可以选择不通过CTD报告此属性。这样可以防止格式字符串被渲染。

这是MSDN关于decorating your types with a CTD的一个非常好的链接。

答案 1 :(得分:1)

从我的实验中,您可以使用.NET 4中的ExpandoObject来处理您想要的内容。 ExpandoObject实现INPC。我一直在创建一个基于ExpandoObject的DynamicViewModel,它执行一些其他的事情,比如彼此依赖的计算属性和Delegate Command注册。