2012-07-02 114 views
2

我正在爲我的WPF項目創建BaseViewModel,它是從DynamicObject派生的,我不太確定如何處理實體的屬性更改'與主要實體(視圖模型中主要實體的導航屬性)相關「。MVVM DynamicObject +實體框架STE實體+屬性更改行爲

例如:

VM:

​​3210

這將是VM的客戶CRUD,例如。並且Customer實體例如具有稱爲Address(地址類型的實體)的導航屬性。

現在,問題是,將視圖綁定到Address內的屬性時,更改不會報告給VM,而是會直接發送到實體,因此不會觸發在VM級別定義的任何行爲。

我知道解釋可能不夠清楚,我只是不知道如何用我可憐的英語解釋自己。

我的問題是:通用的基於DynamicObject的虛擬機如何處理需要爲屬性定義行爲的場景,而不是主要實體的一部分?

回答

1

我最終通過在System.Dynamic.DynamicObject.TryGetMember'getter'方法中使用緩存的BaseViewModels實例包裝導航屬性來解決此問題。不知道它是最高性能的解決方案,但我始終可以在派生實體視圖模型中強制鍵入「導航視圖模型」。

0

如果您的模型(在本例中爲客戶)實現了INotifyPropertyChanged界面,viewMoodel可以註冊到模型PropertyChanged事件。通過這種方式,ViewModel可以獲知發生的任何財產變化,並可以做出相應的反應。

+0

該解決方案需要爲整個圖中的每個實體訂閱Propertychanged事件,這對我來說看起來不太優雅。此外,我不喜歡必須訂閱虛擬機來模擬事件的事實,因爲那樣每次顯示不同的模型時我都需要訂閱和取消訂閱。我也在尋找一個可以在框架級別實現的通用解決方案(我的意思是抽象通用BaseViewModel級別) –

+1

反正你需要某種註冊/註銷功能,這些功能必須是你的框架的一部分。但是,也許這將是一個更優雅的方法: 考慮引入一個接口,如IModel,它有一個方法,例如RegisterCallback(動作回調)以獲取模型的反饋。這更好,因爲只有一個Model與一個ViewModel進行通信。然後讓ViewModel註冊/取消註冊新的回調,每當引入新模型時。最後但並非最不重要的是將泛型類定義約束爲實現IModel的類。 –