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