1

エキスパンダーを備えた.net 4.0 wpfアプリケーションがあり、エキスパンダー内に2つのコンボボックスがあります。エキスパンダー ビューとビュー モデルの有効期間は無限です (つまり、アプリが動作している限り)。

コンボボックス itemsource のコンテンツは、オブジェクト モデルの現在の作業コピーに関連付けられています。

古いオブジェクト モデルを削除して新しいオブジェクト モデルを指すだけの新しいオブジェクト モデルをロードまたは作成するオプションがあります。ビュー モデル (INotifyPropertyChanged を実装) で変更を追跡し、itemsource の新しいコレクションを確実に作成します。

私が気付いたのは、エキスパンダーが折りたたまれているときに新しいオブジェクト モデルを作成した後 (したがって、コンボ ボックスも折りたたまれている)、ANTS メモリ プロファイラーを実行した後、古いオブジェクト モデルを参照するコンボ ボックスが残っていることです...これにより、ゴミが防止されます。古いオブジェクト モデルを取り除くためのコレクター。

ビューモデルに itemssource プロパティと選択したアイテムのブレークポイントをいくつか配置しましたが、新しいオブジェクト モデルが作成されるたびにコードがそれらを (新しいオブジェクト モデルに従って) 新しい値に設定していることがわかります。 itemsource と選択した項目でプロパティの変更を発生させた後、コンボボックスのバインディングがゲッターを呼び出しています。ただし、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