2010-02-12 27 views
6

我有一個MVVM(Prism)應用程序,我需要實現一個主細節屏幕,當主人是一個列表視圖,細節顯示在旁邊。只讀似乎很容易(還沒有做到這一點,但我有我的頭WPF綁定),但編輯/添加混淆了我。如何在MVVM下的同一屏幕上實現CRUD主細節

如何讓它成爲主人不會更新,直到細節保存? 我該怎麼做才能在編輯/添加模式下不能更改主人的當前選擇?

我一直在使用谷歌搜索,但還沒有找到任何有趣的例子。

謝謝。

PS:此視圖是大屏幕上的子視圖。這就是爲什麼我要把主人和細節都放在一起。

回答

0

感謝您的回答。現在我重新閱讀了我的消息,我發現它很含糊。我有一個屏幕編輯一個包含其他子對象的多個列表的對象。我已經在選項卡控件中將它們實現爲不同的選項卡。其中一個選項卡編輯評論,所以我想用列表旁邊的當前選擇的編輯面板顯示評論列表。用戶然後可以使用添加,編輯或刪除按鈕來更新列表。我想以純粹的(ish)MVVM方式來做到這一點。

我想出了下面的設計,似乎與最小的黑客工作。

該視圖將子對象的列表簡單地視爲綁定到ViewModel中的可觀察集合的ListView。我包含了一個子對象緩衝區 - 它用於緩存更改,直到它們準備好保存回列表(或扔掉)。

該視圖還包含一個綁定到ViewModel中的緩衝區對象的編輯面板。只要列表視圖的當前選擇使用深層副本更改,緩衝區就會更新。我嘗試在Selecteditem屬性上使用數據綁定,但該集合從未被調用,因此添加了一個小的代碼隱藏方法,以在選擇更改時強制更新屬性。

列表視圖和編輯視圖是互斥的。理論上你可以隱藏殘疾人,也許使用翻轉屏幕。作爲一般模式,我的應用程序最好同時顯示,因爲編輯面板可能會顯示列表視圖中未顯示的額外信息。通過將IsEnabled綁定到像IsEditCommentMode這樣的ViewModel屬性來控制啓用哪個面板的選擇。

要管理列表的命令必須添加,這些命令是新建,編輯和刪除。請注意,添加和編輯將設置緩衝區,然後將IsEditCommentMode設置爲true。這些列表管理命令僅在IsEditCommentMode爲false時可用。 編輯面板實現「保存」和「取消」命令,只有在IsEditCommentMode爲true時才啓用它們。當執行保存時,它應該從緩衝區複製到列表(添加或更新)並觸發更改通知。最後,它應該將IsEditCommentMode設置爲false。

這一切運作良好,似乎沒有違反任何MVVM tenents(在我的謙虛但常常有缺陷的意見)。

1

你當然可以做到這一點,但在我看來,這樣的UI設計無法利用WPF的全部功能。在將數據保存到SQL Server(或任何地方)之前,舊的WinForms UI通常不會更新大多數應用程序,因爲它們沒有真正的業務對象和WPF等強大的綁定系統。嘗試複製WPF中的WinForms限制看起來對我來說倒退了一步。爲什麼不在UI中顯示最新數據,包括在主視圖中?另外,爲什麼不允許用戶在保存之前編輯多個項目,例如在主視圖中用動畫標記標記任何已編輯但未保存的項目?將這些與廣義撤銷相結合,您可以擁有更好的設計和更直觀的用戶體驗。

但是,如果你的業務需求,使其絕對必要的,這裏是如何做到這一點:從保存之前,

一旦進入你的「作爲細節外部可見

防止數據的變化編輯/添加模式「,複製數據對象並將詳細視圖的DataContext設置爲副本而不是活動對象。當數據被「保存」時,將影子副本中的數據複製回活動對象,並將詳細視圖的DataContext設置回它應該在的位置。

更改而在編輯防止主人的當前選擇/添加模式

兩種可能性:

  1. 在編輯/添加模式,更改主視圖不允許鼠標命中測試或鍵盤焦點

  2. 編輯/添加模式開始時,捕獲「當前選擇」,然後添加一個事件處理程序,監視「當前選擇」更改並立即更改選擇回到原來的樣子。編輯/添加模式結束時,刪除處理程序。這個處理程序可以方便地使用lambda表達式編碼,並使用局部變量上的閉包來存儲當前選擇。