ホームページ > バックエンド開発 > C++ > コレクションと要素のプロパティの変更の両方を追跡する ObservableCollection は存在しますか?

コレクションと要素のプロパティの変更の両方を追跡する ObservableCollection は存在しますか?

Susan Sarandon
リリース: 2025-01-07 16:36:40
オリジナル
827 人が閲覧しました

Does an ObservableCollection Exist That Tracks Both Collection and Element Property Changes?

コレクションと要素の属性の変更を監視する ObservableCollection

質問:

コレクション自体の変更とその要素の属性の変更を同時に監視できるコレクションはありますか?

解決策:

この要件を満たす既製のコレクションがない場合は、ObservableCollection を拡張してその要素の PropertyChanged イベントを監視する実装を作成できます。

実装:

次に、この機能を実装する ObservableCollectionEx の実装例を示します。

<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        Unsubscribe(e.OldItems);
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    protected override void ClearItems()
    {
        foreach (T element in this)
            element.PropertyChanged -= ContainedElementChanged;

        base.ClearItems();
    }

    private void Subscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged += ContainedElementChanged;
        }
    }

    private void Unsubscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged -= ContainedElementChanged;
        }
    }

    private void ContainedElementChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(e.PropertyName)); //Corrected this line.
    }
}</code>
ログイン後にコピー

使用法:

を通常の ObservableCollection と同様に使用しますが、要素のプロパティ変更イベントをサブスクライブするには、ObservableCollectionEx に変換します。 INotifyPropertyChanged

<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
ログイン後にコピー

注: メソッドでは、ContainedElementChanged のパラメーターは OnPropertyChanged を直接使用するのではなく、新しい PropertyChangedEventArgs インスタンスである必要があります。 これは上記のコードで修正されています。 これにより、正しいプロパティ名がイベント ハンドラーに確実に渡されます。 e

以上がコレクションと要素のプロパティの変更の両方を追跡する ObservableCollection は存在しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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