我有一個數據網格,它綁定到實現INotifyPropertyChanged的Item對象。MVVM Datagrid從視圖和模型更新
在ViewModel中,我訂閱了來自更新Item對象的外部設備服務的更改。 datagrid是可編輯的,因此Item也可以從View中更改。該值應寫入設備,但尚未在視圖中更新,因爲設備寫入可能會失敗。如果成功,設備將發出一個我已經訂閱的事件。
我的一些擔憂是。
我在哪裏可以通過ViewModel或Item對象在設備服務上調用寫入? 如何確保數據網格中顯示的值在編輯後「恢復」,直到從設備接收事件?
的幾點思考
如果它的項目對象,然後Item對象不再是DTO,而是一個ViewModel我猜。所以我會爲同一視圖(用戶控件)提供兩種視圖模型。一個用於用戶控件,另一個用於數據網格中的項目。這不符合我對視圖模型的理解。但也許這是錯的? 然後Item如何知道值是從視圖(由用戶)還是由視圖模型(由設備服務)更新?
ViewModel訂閱Item對象上的PropertyChanged。要檢測值是否從視圖中更改,ViewModel可以從服務中取消訂閱PropertyChanged或設置標誌。它似乎很笨重,但會起作用。 也許我應該做兩個屬性:ViewValue和ServiceValue。 ViewModel應該更新ServiceValue並訂閱ViewValue,它可以在閱讀ViewValue之後將ViewValue還原爲ServiceValue。
視圖處理CellEditEnding並通知視圖模型
IEditableObject聽起來不錯,我會看看它。關於第1點,也許我還不夠清楚。我擔心的是,對於「相同」視圖,我可能有兩個視圖模型,一個用於窗口,另一個用於窗口中數據網格的項目。我在想一個viewmodel屬於一個window/usercontrol,而不是一個數據網格中的項目。但也許我的想法是錯誤的? – Karsten
您也可以實現'你們哪綁定到'DataGrid'實體名單IEditableObject'接口。它會給你更多的靈活性。 –
Hmm interresting將DataGrid放入用戶控件中。我喜歡清晰的名字,所以我想知道你是如何命名用戶控件和視圖模型的? – Karsten