2011-03-20 49 views
2

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

回答

2

是的。 WPF绑定系统将使用custom type descriptor在运行时与ViewModel的属性进行交互。我之前使用过这种方法来使KeyValueCollection中的键成为集合上的属性。

这有两个重要的好处。它简化结合:

DataContext.SomeCollectionProperty[SomeKey]可以简化为DataContext.SomeCollectionProperty.SomeKey,如果您为数据上下文,DataContext.SomeKey这是因为它得到一样简单的自定义类型说明符。

它修复了我认为的一个bug - 格式化字符串即使在属性为空时也会被渲染。使用CTD,您可以跳过null(和DBNull)属性,确保如果属性不存在,则不会呈现格式字符串:

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

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

+0

如果您没有动态可用,那么在使用这种技术之前,我已经使用了这种技术。 – 2011-03-21 10:02:11

1

从我的实验中,你可以使用.NET 4中的ExpandoObject来处理你想要的东西。 ExpandoObject实现INPC。我一直在创建一个基于ExpandoObject的DynamicViewModel,它执行一些其他的事情,比如计算属性,它们之间有相互依赖关系,Delegate Command注册。

+0

我以前曾试过这样做,但当时管道管道比我想处理的要多一点。你有没有关于实施expando的好资源? – Will 2011-03-21 10:11:20

+0

开箱即用的ExpandoObject按原样工作。我直接从DynamicObject派生以添加附加功能。我很快就会分享一篇关于这项技术的博客文章,并在我做这件事时更新这篇文章。 – 2011-03-21 12:15:53

+0

好吧,我感谢你们的回复。虽然没有任何设计模式,例如来自GOF的设计模式,但它使用的是属性和诡计? – Dean 2011-03-23 01:57:38