Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当数据源更新且新源具有“等于”SelectedItem的不同对象时,ListBox不会刷新SelectedItem_C#_Wpf_Mvvm_Listbox - Fatal编程技术网

C# 当数据源更新且新源具有“等于”SelectedItem的不同对象时,ListBox不会刷新SelectedItem

C# 当数据源更新且新源具有“等于”SelectedItem的不同对象时,ListBox不会刷新SelectedItem,c#,wpf,mvvm,listbox,C#,Wpf,Mvvm,Listbox,我有一个绑定到ListCollectionView的ListBox,在某一点上我在ListBox中选择了一个项目,然后在将来我将重新创建ListCollectionView,但是ListBox在内部保留对旧列表中项目的引用。这是一个问题,因为该项有一个对其父容器的引用,它实际上导致了内存泄漏 下面是.NET内存分析器的屏幕截图,显示了ListBox的SelectedItem和SelectedValue如何保留对DataPoint对象的引用 new ListCollectionView中的新Dat

我有一个绑定到ListCollectionView的ListBox,在某一点上我在ListBox中选择了一个项目,然后在将来我将重新创建ListCollectionView,但是ListBox在内部保留对旧列表中项目的引用。这是一个问题,因为该项有一个对其父容器的引用,它实际上导致了内存泄漏

下面是.NET内存分析器的屏幕截图,显示了ListBox的SelectedItem和SelectedValue如何保留对DataPoint对象的引用

new ListCollectionView中的新DataPoint对象与现有选定对象相等,因为它有自己的标识符字段,并且我覆盖了该对象。等于但不是同一引用,如何强制ListBox更改其SelectedItems以避免内存泄漏?有没有比强制取消选择和重新选择隐藏代码中的项更好的方法

目前,WPF看起来像:

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

上面的评论解决了你的问题吗?威尔的建议听起来像是你需要的。这就是我经常做的-在视图模型上有一个单独的属性绑定到SelectedItem,或者如果您将其用作多选列表框:SelectedItems,它是一个集合。将新集合指定给绑定属性时,应释放上一个集合。如果不是,而且我已经发生过这种情况,在某些情况下,通过使绑定无效而使其重新绑定,总是为我澄清这一点。您还可以检查以确保其他内容没有保留对该项目的引用。例如,我看到一个引发事件的实现,其中包含对列表项的SelectedItem的引用。它不是一个弱引用,并且它会延迟,导致内存泄漏。解决方法是在该事件中提供一个id,用于识别用户刚刚选择的项目,而不是实际的参考。您使用探查器检查内存状况的做法是正确的。

我通常只需将SelectedItem绑定到ViewModel上的属性。通过这种方式,我始终可以指定选择哪个项目,这是一种经常出现的模式,并且在项目不再存在时(例如,刷新其源集合时)将其清除。“完成”和“完成”。@当选择模式被扩展时,我是否可以绑定到SelectedItem,并且他们可以选择多个项目?@BrandonAGr:SelectedItems在这种情况下。至少在当前版本的框架中,这应该是一个从属属性。
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");
    }
}