2011-03-13 53 views
0

使用MVVM,我的viewmodel是我的WPF窗口的數據上下文。在viewmodel中是一個可觀察的集合,它將項目保存在列表框中。當我將項目添加到集合中時,列表框按預期進行更新如何在更改對象引用後停止WPF DataContext失敗?

作爲我的通用撤消函數的一部分,可以將observablecollection替換爲較舊的版本。這通過將集合傳遞給引用方法並更改引用來實現。撤消之後的所有內容除了列表框之外都能正常工作。這繼續顯示來自舊參考的數據。

我該如何阻止這種情況發生,或者改變datacontext使用的引用,以便我的列表框被「取消」並繼續工作?

回答

0

您需要提供一些更改通知,以便觸發UI更新,而不會將ref變量重新分配給另一個實例。要獲取通知,可以清除並重新填充原始的ObservableCollection實例,或者在交換實例後觸發集合屬性名稱的PropertyChanged事件。

+0

問題不在於沒有變更通知。當我向集合中添加更多項目時,它們會停止顯示,因爲列表框會記住舊的參考。 – Jimbob 2011-03-13 22:04:18

+0

...如果我在窗口的代碼中手動重置ItemsSource,它仍然可以工作。但是這對MVVM來說不是很好! – Jimbob 2011-03-13 22:14:41

+0

@Jimbob - 在ViewModel中提高PropertyChanged會更好。 – 2011-03-13 22:24:26

0

使用MVVM模式,屬性在ViewModel中更改,其中setter引發PropertyChanged事件。該事件在View中處理(由WPF自動處理)並刷新綁定。

在你的情況下,值被改變時沒有調用setter,所以PropertyChanged事件(如果存在的話)沒有被引發。

一個選項可能是從undo代碼手動引發PropertyChanged事件。這將允許您保留現有設計(請注意INotifyPropertyChanged.PropertyChangedObservableCollection.CollectionChanged不同 - 如果不清楚,請進行一些研究)。

第二種選擇是處理CollectionChanged事件,並保留ItemsAdded和ItemsRemoved的記錄。 您的撤消機制可以重新添加任何已刪除的項目,或刪除已添加的項目。這可能需要一點設計調整。

我會去第二個設計,因爲我認爲設計反思可能是一個好主意。如果您使用的是MVVM,那麼您應該使用Commands,如果您使用Commands,則可以通過擴展命令來整齊地實現撤消/重做功能(請記住,用戶所做的操作通常不僅僅是值更改)。

相關問題