一千萬個為什麽

搜索

在不釋放SelectedItem的情況下替換ListView的ItemsSource

我將ListView數據綁定到來自服務層的集合。響應事件,與​​ListView關聯的視圖模型刷新ListView的數據。為了檢索更新的數據,vm從服務層檢索新的集合實例。此集合中的項目為Equals(),但不是ReferenceEquals()與先前返回的集合中的等效項目。

您是否可以推薦一種避免以下方法缺點的方法,同時仍允許vm將此數據插入ListView而不會導致ListView丟失其SelectedItem?

謝謝,


A simple approach (view model code; ListView's SelectedItem & ItemsSource are bound to identically-bound properties on the vm):

var selectedItem = SelectedItem;
ItemsSource = service.GetData();
SelectedItem = Accounts.SingleOrDefault(x => x.Equals(selectedItem));

這種方法看起來很難看。它還涉及重置SelectedItem - 如果更改SelectedItem會更改主 - 詳細信息表單上的詳細信息編輯,則可能會出現問題。 (ItemsSource的設置導致SelectedItem被清除,這就是它在最後一行重新設置的原因。)

Another approach is writing an adapter that loads an ObservableCollection<> with proxy objects pointing to the data returned from the initial service layer call. Any time updated data is retrieved from the service layer, the proxy objects are updated to point to the newly-retrieved objects. This way, the ListView's ItemsSource does not need to be reset to update the ListView (it stays bound to the same ObservableCollection<>) which means that SelectedItem won't be reset. A downside to this approach is the amount of code involved.

最佳答案

我最終編寫了映射器代碼,該代碼加載了一個ObservableCollection,代理對象指向從服務層檢索到的真實對象。每次從服務層獲取更新時,映射器代碼將根據需要添加/刪除/更新代理對象。

轉載註明原文: 在不釋放SelectedItem的情況下替換ListView的ItemsSource