[wpf] INotifyPropertyChanged與ViewModel中的DependencyProperty


6 Answers

根據WPF性能指南,DependencyObjects的性能明顯優於實現INotifyPropertyChanged的POCO:

http://msdn.microsoft.com/en-us/library/bb613546.aspx

Question

在Model-View-ViewModel體系結構WPF應用程序中實現ViewModel時,似乎有兩個主要選擇如何使其可用於數據綁定。 我已經看到使用DependencyProperty實現視圖將要綁定的屬性,而我已經看到實現INotifyPropertyChanged的ViewModel。

我的問題是我應該在什麼時候比另一個更喜歡? 是否有任何性能差異? 將ViewModel依賴關係提供給WPF真的是個好主意嗎? 做出設計決定時還需要考慮什麼?




我認為DependencyProperty和INotifyPropertyChanged用於Binding中的兩個不同的事情:第一個用於使屬性成為綁定的目標並從另一個屬性接收輸入(使用{Binding ...}來設置屬性),最後一個當您希望將某個屬性的值用作綁定源(綁定路徑表達式中的名稱)時。 所以選擇僅僅是技術性的。




從表現力的角度來看,我非常喜歡使用依賴屬性,並對INotifyPropertyChanged的思想感到INotifyPropertyChanged 。 除了string屬性名稱和由於事件訂閱導致的可能的內存洩漏之外, INotifyPropertyChanged是一種更加明確的機制。

使用易於理解的靜態元數據,依賴屬性意味著“何時這樣做”。 這是一種陳述式的方式,可以讓我對優雅感到投贊成票。




我更喜歡更直接的方法,我在沒有INotifyPropertyChanged的Presentation Model中發表了博文。 使用數據綁定的替代方法,您可以直接綁定到CLR屬性,而無需任何簿記代碼。 您只需在視圖模型中編寫純舊的.NET代碼,並在數據模型更改時進行更新。




將ViewModel依賴關係提供給WPF真的是個好主意嗎?

.NET 4.0將具有System.Xaml.dll,因此您不必依賴任意框架來使用它。 請參閱Rob Relyea關於他的PDC會話文章。

我的意思

XAML是一種描述對象的語言,WPF是一個描述對像是UI元素的框架。

它們的關係類似於C#,一種描述邏輯的語言,.NET,一種實現特定類型邏輯的框架。

XAML的目的是聲明式對像圖。 W * F技術非常適合這種範例,但XAML獨立存在。

XAML和整個依賴系統作為WF和WPF的獨立堆棧實現,可能會利用不同團隊的經驗,而不會在它們之間創建依賴關係(無雙關語意圖)。




如果你想將屬性公開給其他控件,你必須使用依賴屬性...但是祝你好運,因為他們需要一段時間才能弄清楚...




依賴屬性旨在支持在UI元素上綁定(作為目標),而不是作為數據綁定的源,這是INotifyProperty的出處。從純粹的角度來看,您不應該在ViewModels上使用DP。

“為了成為一個綁定的來源,屬性不需要是一個依賴屬性;你可以使用任何CLR屬性作為綁定源,但是為了成為綁定的目標,屬性必須是依賴項屬性為了使單向或雙向綁定有效,源屬性必須支持傳播到綁定係統和目標的更改通知。對於自定義CLR綁定源,這意味著該屬性必須支持INotifyPropertyChanged。集合應該支持INotifyCollectionChanged。“

所有依賴對像都不能被序列化(這可能妨礙ViewModel和DTO(POCO)的使用。

與WPF相比,Silverlight中的DP存在差異。

http://msdn.microsoft.com/en-us/library/cc221408(v=VS.95).aspx

http://msdn.microsoft.com/en-us/library/cc903933(VS.95).aspx






Related