ホームページ > バックエンド開発 > C++ > 項目プロパティの変更を ObservableCollection に効率的に通知するにはどうすればよいですか?

項目プロパティの変更を ObservableCollection に効率的に通知するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-05 19:33:41
オリジナル
185 人が閲覧しました

How to Efficiently Notify an ObservableCollection of Item Property Changes?

項目が変更されたときに ObservableCollection に通知する方法

.NET の ObservableCollection クラスは、コレクションへの変更を追跡する手段を提供します。またはアイテムを削除します。ただし、コレクション内の項目のプロパティへの変更は自動的に検出されません。

この問題に対処するために、質問で言及されている TrulyObservableCollection などのカスタム実装が存在します。このクラスは ObservableCollection を拡張し、コレクションに追加またはコレクションから削除された項目のイベント ハンドラーを追加します。また、個々の項目のプロパティの変更も追跡します。

実装と使用法

TrulyObservableCollection を使用するには、まずインスタンスを作成し、それに項目を設定します。

public class MyViewModel
{
    public TrulyObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new TrulyObservableCollection<MyType>();
        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }
}
ログイン後にコピー

ただし、TrulyObservableCollection の実装により Reset イベントが発生しますアイテムのプロパティが変更されるたびに、コレクション全体に対して。これはパフォーマンスに影響を与える可能性があり、望ましい動作ではない可能性があります。

代替アプローチ

代替アプローチは、コレクション内の各項目のプロパティ変更イベント ハンドラーを直接登録することです。 :

public class MyViewModel
{
    public ObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new ObservableCollection<MyType>();
        MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;

        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }

    private void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
            foreach (MyType item in e.NewItems)
                item.PropertyChanged += MyType_PropertyChanged;

        if (e.OldItems != null)
            foreach (MyType item in e.OldItems)
                item.PropertyChanged -= MyType_PropertyChanged;
    }

    private void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "MyProperty")
            DoWork(); // Perform desired action
    }
}
ログイン後にコピー

アイテムがコレクションに追加またはコレクションから削除されるときにのみプロパティ変更イベント ハンドラーを登録することで、このアプローチはアイテムのプロパティ変更をよりターゲットにします。パフォーマンスのオーバーヘッドを回避しながら効果的に。

以上が項目プロパティの変更を ObservableCollection に効率的に通知するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート