我有一个 .net 4.0 wpf 应用程序,它有一个扩展器,在扩展器内部,我有 2 个组合框。扩展器视图和视图模型的生命周期是无限的(即只要应用程序还活着)。
组合框 itemsource 的内容与我的对象模型的当前工作副本相关联。
我可以选择加载或创建一个新的对象模型,它只是删除旧的对象模型并指向新的对象模型。在我的视图模型(实现 INotifyPropertyChanged)中,我跟踪更改并确保为 itemsource 创建一个全新的集合。
我注意到的是,在展开器折叠时创建新对象模型(因此组合框也折叠)并且我运行 ANTS 内存分析器后,我仍然有组合框引用旧对象模型......这可以防止垃圾收集器摆脱旧的对象模型。
我确实在我的视图模型中为 itemssource 属性和所选项目设置了一些断点,并且我可以看到,每当创建新对象模型时,我的代码确实将它们设置为新值(根据新对象模型),我可以看到在我对 itemsource 和选定项目进行属性更改后,组合框绑定正在调用我的 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");
}
}
}