我有一個獨立的ICommand
實現。它修改實體的信息。作爲視圖的ViewModel
的屬性,同一實體綁定到View
。來自ICommand的反饋
我想要實現的是,實體(因此ViewModel,因此 - 視圖)在執行該命令後用新信息更新。我瞭解它的方式,ICommand
-s是單向街道。他們修改基礎數據,但不應該給出直接結果。
因此,我通過使用MVVMLight框架,在執行結束時通過從Command內發送Message
來實現此目的。當接收到消息時(更新信息作爲消息的屬性傳遞),暴露實體的視圖模型也訂閱相同的消息並自我更新。
附加好處是其他視圖模型也可以訂閱並對同一事件作出反應。但是,這個實施的主幹是events
。從我讀過的內容來看,事件的整個概念並不適合MVVM模式。還是跨VM通信可以這樣做?
實施例:
域模型
- 用戶
First Name
Last Name
Full Name { get { return First Name + Last Name } }
視圖模型
- 用戶視圖模式 -
User Domain Model
周圍包裹,但不存儲它的實例string First Name
string Last Name
string Full Name
(注:不知道它是如何計算出來的任何東西)ICommand Change First Name
- 方法:
MapFromDomainModel(UserDomainModel)
。當查看模型收到UserDomainChanged
消息時調用。
命令
Change First Name : ICommand
- 更改在
User Domain Model
- 的
First Name
發送一個消息UserDomainChanged(UserDomainModel)
- 更改在
看出,在這個例子中,視圖模型不知道如何Full Name
計算,並且不/不應該知道的是,當First Name
改變時,Full Name
也應該被改變。這就是爲什麼命令直接在域模型上工作並觸發消息。
而且,我可能會在窗口的其他意見,具有結合到同一個用戶的域模型視圖模型。通過訂閱相同的消息,他們可以獨立更新自己。
這是一個很好的方法嗎?有更好的嗎?
我會說這種方法完全沒問題。除非您想要將視圖模型的引用添加到您的命令或在您的實體上實現INotifyPropertyChanged。 – Jehof
我通常在我的命令中修改一些屬性,然後由於NotifyPropertyChanges和相應的綁定而更新視圖。這是否足夠,或者你有更復雜的情況? – heltonbiker
@heltonbiker,所以你的命令是修改視圖模型,而不是底層數據模型?我執行的命令執行持續更改 - 針對域模型,並且由於執行的業務邏輯,視圖模型的其他屬性可能會在命令或視圖模型不知情的情況下更改。 –