C# WPF内存泄漏和折叠的组合框

C# WPF内存泄漏和折叠的组合框,c#,.net,wpf,memory-leaks,C#,.net,Wpf,Memory Leaks,我有一个.NET4.0WPF应用程序,它有一个扩展器,在扩展器内部有两个组合框。expander视图和视图模型的生命周期是无限的(即只要应用程序处于活动状态) combobox itemsource的内容绑定到我的对象模型的当前工作副本 我可以选择加载或创建一个新的对象模型,只需删除旧的对象模型并指向新的对象模型。在我的视图模型(实现INotifyPropertyChanged)中,我跟踪更改并确保为itemsource创建一个全新的集合 我注意到,当扩展器被折叠(因此组合框也被折叠)并运行AN

我有一个.NET4.0WPF应用程序,它有一个扩展器,在扩展器内部有两个组合框。expander视图和视图模型的生命周期是无限的(即只要应用程序处于活动状态)

combobox itemsource的内容绑定到我的对象模型的当前工作副本

我可以选择加载或创建一个新的对象模型,只需删除旧的对象模型并指向新的对象模型。在我的视图模型(实现INotifyPropertyChanged)中,我跟踪更改并确保为itemsource创建一个全新的集合

我注意到,当扩展器被折叠(因此组合框也被折叠)并运行ANTS memory profiler时,在创建了一个新的对象模型之后,我仍然拥有引用旧对象模型的组合框。。。这将防止垃圾收集器摆脱旧的对象模型

我确实在viewmodel中为itemssource属性和所选项目设置了一些断点,我可以看到我的代码确实将它们设置为新值(根据新对象模型)每当创建新的对象模型时,在我对itemsource和selected项进行属性更改之后,我可以看到ComboBox绑定正在调用我的getter。但是,ANTS仍然报告组合框正在引用旧的对象模型。有趣的是,如果我展开扩展器,我的组合框变为可见,ANTS会报告所有对旧对象模型的引用都消失了。什么可以解释这种行为

<ComboBox 
    Grid.Row="0" Grid.Column="1" VerticalAlignment="Center"
    ItemsSource="{Binding Path=AvailableSitesA, Mode=OneWay}"
    SelectedValue="{Binding Path=SelectedSiteA}"
    DisplayMemberPath="Name"></ComboBox>


ObservableCollection<Site> AvailableSitesA
    {
        get { return _availableSitesA; }

        private set
        {
            if (value != _availableSitesA)
            {
                _availableSitesA = value;
                RaisePropertyChanged("AvailableSitesA");
            }
        }
    }

可观察到的可用收集量a
{
获取{return\u availablestesa;}
专用设备
{
如果(值!=\u可用性测试a)
{
_availableSitesA=值;
RaisePropertyChanged(“可用性测试”);
}
}
}

您不应该每次都恢复
可观察收集。相反,请清除其所有项并插入新项。这正是一个可观察的集合的意义所在。我的意思是,保留ObservaleCollection的单个实例,就不会有此漏洞。我应该提到,我确实在ctor中创建了AvailableSetsa(ObservaleCollection)的实例,然后在创建新对象模型时使用“.Clear()”。我不需要“.Add(X)”来添加新项目。我还尝试使用一个列表而不是ObservableCollection,并在创建新对象模型时将其设置为空列表(作为清除),并将is设置为新列表。。。我得到了两个相同的结果。继续指向旧集合,直到我展开扩展器。你能显示你正在修改Observablecollection的代码吗?我正在创建一个简单的项目来演示这个问题;我会在完成后发布它…仍然不知道到底是什么地方出了问题,但注意到使用.NET4.5无法重现该问题。。。仅在.NET4.0中发生