2011-03-20 79 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