1

我有一个 .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");
            }
        }
    }
4

0 回答 0