簡體   English   中英

更新數據源並且新源具有與“等於” SelectedItem相同的對象時,ListBox不會刷新SelectedItem

[英]ListBox not refreshing SelectedItem when DataSource is updated and new source has a different object that 'equals' SelectedItem

我有一個綁定到ListCollectionView的ListBox,有一次我在列表框中選擇一個項目,然后在將來重新創建ListCollectionView,但是ListBox在內部保留了對舊列表中某個項目的引用。 這是一個問題,因為該項目具有對其父容器的引用,並且有效地導致了內存泄漏。

這是.NET內存分析器的屏幕快照,顯示了ListBox的SelectedItem和SelectedValue如何保持對DataPoint對象的引用。

在此處輸入圖片說明

新ListCollectionView中的新DataPoint對象等於現有選定對象(因為它具有其自己的標識符字段,並且我覆蓋object.Equals),但是引用不相同,如何強制ListBox更改其SelectedItems以便它不會導致內存泄漏? 是否有比強制從后面的代碼中強制取消選擇和重新選擇項目更好的方法?

當前,WPF如下所示:

<!-- Listbox of items -->
<ListBox
    x:Name="ListBoxOfStuff"
    ItemsSource="{Binding ListView}"
    ItemTemplate="{Binding ItemTemplate}"

在我后面的代碼中

public ListCollectionView ListView
{
    get { return _listview; }
    private set
    {
        if (_listview == value)
            return;

        _totalItemsInCollection = value.Count;
        _listview = value;
        _listview.Filter = this.ApplyFilter;

        RaisePropertyChanged("ListView");
        RaisePropertyChanged("FilteredInCount");
    }
}

(以上)評論是否解決了您的問題? 威爾的建議聽起來像您所需要的。 這就是我一直在做的-在您的視圖模型上有一個綁定到SelectedItem的單獨屬性,或者如果您將其用作多選列表框:SelectedItems(這是一個集合)。 將新集合分配給您的綁定屬性時,應釋放前一個集合。 如果不是這樣(在某些情況下我曾經發生過這種情況),則通過使綁定無效來重新綁定它,請務必為我清除。 您還可以檢查以確保其他內容沒有保留對該項目的引用。 例如,我看到一個引發事件的實現,其中包含對列表項的SelectedItem的引用。 它不是弱引用,並且持續存在,導致內存泄漏。 解決方法是在該事件中提供一個ID,該ID用於標識用戶剛剛選擇的項目,而不是實際的參考。 在使用探查器檢查內存狀況(榮譽)時,您做對了事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM