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

項目のプロパティが変更されたときに ObservableCollection に通知させるにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-04 12:12:35
オリジナル
607 人が閲覧しました

How to Make ObservableCollection Notify When Item Properties Change?

アイテムの変更時に ObservableCollection に通知する

ObservableCollection は、INotifyCollectionChanged インターフェイスを実装する便利なコレクション タイプで、コレクション内の変更をリッスンできます。 。ただし、ObservableCollection は、コレクション内の項目のプロパティに加えられた変更については通知しません。

制限の克服

この制限に対処するには、カスタム ObservableCollection を実装できます。 TrulyObservableCollection と呼ばれる、ObservableCollection から継承し、CollectionChanged イベント ハンドラーをオーバーライドしてサブスクライブし、コレクションに追加またはコレクションから削除された項目の PropertyChanged イベントのサブスクライブを解除します。

TrulyObservableCollection

public class TrulyObservableCollection<T> : ObservableCollection<T>
where T : INotifyPropertyChanged
{
    public TrulyObservableCollection()
        : base()
    {
        CollectionChanged += TrulyObservableCollection_CollectionChanged;
    }

    void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        OnCollectionChanged(a);
    }
}
ログイン後にコピー

使用法

TrulyObservableCollection を使用します。ObservableCollection を次のように置き換えるだけです。コード内のTrulyObservableCollection。変更を処理するには、コレクションの CollectionChanged イベントにハンドラーをアタッチする必要があります。

MyItemsSource = new TrulyObservableCollection<MyType>();
MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
ログイン後にコピー

CollectionChanged イベント ハンドラー内で、コレクションに追加またはコレクションから削除された項目の PropertyChanged イベントをサブスクライブしたり、サブスクライブ解除したりできます。

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

    if (e.OldItems != null)
        foreach (MyType item in e.OldItems)
            item.PropertyChanged -= new PropertyChangedEventHandler(MyType_PropertyChanged);
}
ログイン後にコピー

代替アプローチ

TrulyObservableCollection を使用すると、コレクション変更通知を強制できますが、これは最適なアプローチではない可能性があります。より一般的なパターンは、ObservableCollection の CollectionChanged ハンドラー内で個々の項目の PropertyChanged イベントを処理することです。これにより、コレクション内の特定のプロパティの変更のみが UI の更新を引き起こすようになり、パフォーマンスが最適化され、より詳細な制御が可能になります。

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

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