gpt4 book ai didi

c# - 更新数据源时 ListBox 不刷新 SelectedItem 并且新源具有与 'equals' SelectedItem 不同的对象

转载 作者:太空宇宙 更新时间:2023-11-03 13:26:15 25 4
gpt4 key购买 nike

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

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

enter image description here

新的 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");
}
}

最佳答案

评论(以上)是否解决了您的问题?威尔的建议听起来正是您所需要的。这就是我一直在做的——在你的 View 模型上有一个单独的属性绑定(bind)到 SelectedItem,或者如果你将它用作多选列表框:SelectedItems(这是一个集合)。当一个新的集合被分配给你的绑定(bind)属性时,前一个应该被释放。如果不是(在某些情况下我已经发生过这种情况)通过使绑定(bind)无效来重新绑定(bind),总是为我清除它。您还可以检查以确保其他东西没有保留对该项目的引用。例如,我看到一个引发事件的实现,其中包含对列表项的 SelectedItem 的引用。它不是弱引用,它一直存在,导致内存泄漏。解决方法是在该事件中提供一个 id,用于标识用户刚刚选择的项目,而不是实际的引用。你做对了,使用你的探查器检查内存情况(荣誉)。

关于c# - 更新数据源时 ListBox 不刷新 SelectedItem 并且新源具有与 'equals' SelectedItem 不同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22331464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com