5

我正在用C#編寫一個桌面應用程序,使用帶有實體框架模型的MVVM模式。我傾向於在我的虛擬機中使用DependencyProperties,並且(通常)更喜歡使用此係統來實現INotifyPropertyChanged。我想保持一致。我的虛擬機訪問模型中的實體,並且我設法使事情保持獨立 - 除了綁定和命令名稱以及模型已經知道虛擬機的知識之外,View沒有知道虛擬機的知識。ViewModel在實體框架中使用DependencyProperty

使用INotifyPropertyChanged的在虛擬機,它似乎很容易更新模型中的實體:

public string Forename 
    { 
     get { return CurrentPerson.Forename; } 
     set 
     { 
      if (Forename != value) 
      { 
       CurrentPerson.Forename = value; 
       NotifyPropertyChanged("Forename"); 
      } 
     } 
    } 

...其中CurrentPerson是實體數據模型Person對象自動創建。因此沒有專門爲存儲Forename而創建的私人領域。

使用DependencyProperties,看來我將不得不創建一個DP,使用GetValue和Setvalue添加默認Property,然後使用PropertyChangedCallback來更新CurrentPerson實體。在這種情況下調用回調似乎會增加開銷,以便與我的其他VM保持一致。

因此,問題是否這些方法之一是否我應該做的事情?在這種情況下,我應該使用DependencyProperty還是INotifyPropertyChanged?有一點需要指出的是,這可能是一個非常大規模的項目(插件和來自不同機器的大量數據庫訪問),並且所有事情都應該是可重用的,並且模塊儘可能地「斷開連接」 。

+0

什麼是視圖模型使用依賴屬性的好處?換句話說 - INotifyPropertyChanged沒有提供額外的值。 –

+0

我正在尋找良好的速度和與DP的好結合功能。請記住,我在View中直接綁定到DP的XAML。財產價值變化也可能頻繁發生。從我之前發現的參考文獻來看,爲了加快裝訂速度,DP是要走的路。這與我的其他設計一致。但是,如果所有這些回調都是通過單獨修改實體對象來進行的,那麼這些都不是好事。 –

回答

2

我會推薦使用INotifyPropertyChanged而不是DependencyProperty。我在ViewModels中遠離DependencyProperty的主要原因是因爲DependencyProperty位於WindowsBase.dll中。這使您與Windows UI有點過分(至少恕我直言)。

使用INotifyPropertyChanged更容易維護,因爲它允許各種插件以他們想要的方式實現它。如果強制依賴屬性,所有視圖模型都需要從DependencyObject繼承。

請參閱這篇文章瞭解更多詳細的使用INotifyPropertyChanged的和的DependencyProperty:http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html

另一個支撐答案:https://stackoverflow.com/a/783154/27669

+0

謝謝。我認爲INotifyPropertyChanged將會成爲一種方式,儘管在INotifyPropertyChanged中使用「Magic Strings」的各種安全措施後,我仍然覺得DP更加優雅。我接觸到這個觀點的兩個主要原因是:1)使用DP的狀態複製和2)有時我需要改變整個對象狀態,而且我可以簡單地使用PropertyChanged(null)來實現。感謝您的答覆和參考。 –

+0

耦合到Windows用戶界面可能是一個主要問題。只是修復了一個項目,其中相同的dll用於Web服務,但依賴屬性堅持它在UI線程上運行,這在多線程Web服務中非常棘手。這種體系結構的靈活性(即在實體Dll中與Windows GUI緊密耦合)遠比GUI的優雅更重要。 – user1496062