ホームページ バックエンド開発 C#.Net チュートリアル WPF データ バインディングのコア テクノロジ

WPF データ バインディングのコア テクノロジ

Jun 23, 2017 pm 04:04 PM
辞書 集める

WPF の中核となる技術的利点の 1 つはデータ バインディングです。データ バインディングは、データ操作を通じてインターフェイスを更新できます。

データ バインディングに最もよく使用される 2 つのクラスは、ObservableCollection と Dictionary です。

ObservableCollection は動的データ コレクションを表します。このコレクションは、アイテムが追加されたとき、アイテムが削除されたとき、またはリスト全体が更新されたときに通知を提供します。コレクション データを更新することでインターフェイスの表示を更新できます。

Dictionary 辞書クラスは検索やデータ操作のパフォーマンスが非常に悪いため、一部の設定項目のコレクションはこれを使用して保存されます。

そこで、ObservableCollectionとDictionaryを組み合わせたクラスがないか皆で考え、ObservableDictionaryクラスが形成されました。

ObservableDictionary クラスのバージョンはインターネット上にたくさんあります。私の知る限り、最も古くて古典的なものは、Dr.WPF の辞書への ItemsControl です (私が間違っている場合)。 、私は無知です))。

今日提供するバージョンは、インターネット上の他のバージョンや Dr.WPF のバージョンも参照しています。

Dr.WPF での定義は次のとおりです:

public class ObservableDictionary <TKey, TValue> :
        IDictionary<TKey, TValue>,
        ICollection<KeyValuePair<TKey, TValue>>,
        IEnumerable<KeyValuePair<TKey, TValue>>,
        IDictionary,
        ICollection,
        IEnumerable,
        ISerializable,
        IDeserializationCallback,
        INotifyCollectionChanged,
        INotifyPropertyChanged
ログイン後にコピー

よく見ると、ここで継承されたインターフェイスは、Dictionary によって継承されたインターフェイスとほとんど同じであることがわかりますが、次の点が異なります。 INotifyCollectionChanged、INotifyPropertyChanged

したがって、今日私が提供するバージョンは、Dictionary と INotifyCollectionChanged、INotifyPropertyChanged を直接継承しています。

テストしましたが、バグはなく、パフォーマンスは優れています。コードは以下のとおりです:

    public class ObservableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, INotifyCollectionChanged, INotifyPropertyChanged
    {
        public ObservableDictionary()
            : base()
        { }

        private int _index;
        public event NotifyCollectionChangedEventHandler CollectionChanged;
        public event PropertyChangedEventHandler PropertyChanged;

        public new KeyCollection Keys
        {
            get { return base.Keys; }
        }

        public new ValueCollection Values
        {
            get { return base.Values; }
        }

        public new int Count 
        {
            get { return base.Count; }
        }

        public new TValue this[TKey key]
        {
            get { return this.GetValue(key); }
            set { this.SetValue(key, value); }
        }

        public TValue this[int index]
        {
            get { return this.GetIndexValue(index); }
            set { this.SetIndexValue(index, value); }
        }

        public new void Add(TKey key, TValue value)
        {
            base.Add(key, value);
            this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, this.FindPair(key), _index));
            OnPropertyChanged("Keys");
            OnPropertyChanged("Values");
            OnPropertyChanged("Count");
        }

        public new void Clear()
        {
            base.Clear();
            this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
            OnPropertyChanged("Keys");
            OnPropertyChanged("Values");
            OnPropertyChanged("Count");
        }

        public new bool Remove(TKey key)
        {
            var pair = this.FindPair(key);
            if (base.Remove(key))
            {
                this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, pair, _index));
                OnPropertyChanged("Keys");
                OnPropertyChanged("Values");
                OnPropertyChanged("Count");
                return true;
            }
            return false;
        }

        protected void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            if (this.CollectionChanged != null)
            {
                this.CollectionChanged(this, e);
            }
        }

        protected void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #region private方法
        private TValue GetIndexValue(int index)
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (i == index)
                {
                    var pair = this.ElementAt(i);
                    return pair.Value;
                }
            }

            return default(TValue);
        }

        private void SetIndexValue(int index, TValue value)
        {
            try
            {
                var pair = this.ElementAtOrDefault(index);
                SetValue(pair.Key, value);                
            }
            catch (Exception)
            {
                
            }
        }

        private TValue GetValue(TKey key)
        {
            if (base.ContainsKey(key))
            {
                return base[key];
            }
            else
            {
                return default(TValue);
            }
        }

        private void SetValue(TKey key, TValue value)
        {
            if (base.ContainsKey(key))
            {
                var pair = this.FindPair(key);
                int index = _index;
                base[key] = value;
                var newpair = this.FindPair(key);
                this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, newpair, pair, index));
                OnPropertyChanged("Values");
                OnPropertyChanged("Item[]");
            }
            else
            {
                this.Add(key, value);
            }
        }

        private KeyValuePair<TKey, TValue> FindPair(TKey key)
        {
            _index = 0;
            foreach (var item in this)
            {
                if (item.Key.Equals(key))
                {
                    return item;
                }
                _index++;
            }
            return default(KeyValuePair<TKey, TValue>);
        }

        private int IndexOf(TKey key)
        {
            int index = 0;
            foreach (var item in this)
            {
                if (item.Key.Equals(key))
                {
                    return index;
                }
                index++;

            }
            return -1;
        }

        #endregion

    }
ログイン後にコピー

拡張に関しては、より技術的でスケーラブルな Dr.WPF バージョンを使用して変更できます。 !

以上がWPF データ バインディングのコア テクノロジの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

辞書内の最初と最後の要素を取得する Python プログラム 辞書内の最初と最後の要素を取得する Python プログラム Sep 07, 2023 pm 05:01 PM

Python は、動的セマンティクスを備えたインタープリタ型のオブジェクト指向の高レベル プログラミング言語です。 1991 年に GudioVanRossum によって開発されました。構造化プログラミング、オブジェクト指向プログラミング、関数型プログラミングなど、複数のプログラミング パラダイムをサポートします。このトピックに入る前に、私たちが提供する質問に関連する基本的な概念を確認しましょう。辞書は、一意で変更可能で、順序付けられた項目のセットです。中括弧は辞書を記述するときに使用され、中括弧にはキーと値が含まれます。キー名を使用して辞書オブジェクトを参照できます。データ値は、キー:値のペアの形式で辞書に保存されます。順序付きと順序なしの意味 辞書に順序があると言うときは、その内容が一定の順序を持​​ち、変化しないことを意味します。未注文のアイテムは明確な順序がないため、使用できません。

空の辞書キーが正しくありません: Python の辞書キー エラーを解決するにはどうすればよいですか? 空の辞書キーが正しくありません: Python の辞書キー エラーを解決するにはどうすればよいですか? Jun 24, 2023 pm 03:03 PM

Python の辞書は、キーと値のペアを保存でき、高速な検索および挿入機能を備えた柔軟で強力なデータ構造です。ただし、ディクショナリのキーと値のペアに注意しないと、ディクショナリ キーが空になるという問題が発生する可能性があります。この問題により、コードがクラッシュしたり、予期しない結果が出力されたりすることがよくあります。この記事では、Python で辞書キーが空のエラーを解決する 2 つの方法を紹介します。方法 1: if ステートメントを使用して、空の辞書キーを回避する Python 辞書は重複キーを持つことができません。重複キーを持つと、以前のキーと値のペアが上書きされます。辞書キーの値が空の場合

Go 言語でコレクションのような関数を実装するのはなぜ難しいのでしょうか? Go 言語でコレクションのような関数を実装するのはなぜ難しいのでしょうか? Mar 24, 2024 am 11:57 AM

Go 言語ではコレクションのような関数を実装するのが難しく、多くの開発者を悩ませている問題です。 Python や Java などの他のプログラミング言語と比較して、Go 言語には set や map などの組み込みのコレクション型が存在しないため、コレクション関数を実装する際に開発者にいくつかの課題が生じます。まず、コレクションのような機能を Go 言語で直接実装することがなぜ難しいのかを見てみましょう。 Go 言語で最も一般的に使用されるデータ構造はスライスとマップであり、コレクションのような関数を完成させることができますが、

Python で辞書内の次のキーを取得するにはどうすればよいですか? Python で辞書内の次のキーを取得するにはどうすればよいですか? Aug 28, 2023 pm 11:45 PM

辞書は、Python の強力なデータ型です。これはキーと値のペアで構成されます。このデータ型を使用すると、検索、追加、その他の操作を効率的に実行できます。辞書内の値にアクセスするのは簡単ですが、場合によっては辞書内の次のキーを検索する必要があるかもしれません。 Python には、特定の要件に応じて、これを実現するためのいくつかの方法が用意されています。この記事では、Python で辞書内の次のキーを取得するさまざまな方法を検討します。キーとインデックスのメソッドを使用すると、Python では辞書は順序付けされていないコレクションになります。したがって、最初にキーを何らかのソートされた形式に変換する必要があります。まず、すべてのキーをリストの形式で追加します。次に、リストにインデックスを付けることで次のキーを見つけることができます。キーの助けを借りて、次のこともできます。

Java コレクションのソートパフォーマンスを最適化する方法 Java コレクションのソートパフォーマンスを最適化する方法 Jun 30, 2023 am 10:43 AM

Java は、さまざまな種類のソフトウェア開発で広く使用されている強力なプログラミング言語です。 Java 開発では、コレクションの並べ替えを伴うシナリオが頻繁に含まれます。ただし、コレクションソートの性能最適化を行わないと、プログラムの実行効率が低下する可能性があります。この記事では、Java コレクションの並べ替えのパフォーマンスを最適化する方法について説明します。 1. 適切なコレクション クラスの選択 Java には、ArrayList、LinkedList、TreeSet など、並べ替えに使用できるコレクション クラスが多数あります。さまざまなコレクションクラスが含まれています

C++プログラム初期化辞書 C++プログラム初期化辞書 Sep 09, 2023 pm 07:01 PM

C++ は、同じ名前の辞書という点で Python とは異なりますが、同様の機能を備えた同じデータ構造を持っています。 C++ はマッピングをサポートしており、STL クラス std::map で使用できます。マップ オブジェクトには各エントリに値のペアが含まれており、1 つはキー値、もう 1 つはマップ値です。キー値は、マップ内のエントリを検索し、一意に識別するために使用されます。マップされた値は必ずしも一意である必要はありませんが、キーの値はマップ内で常に一意である必要があります。マッピングの使い方を見てみましょう。まず、C++ でマップされたデータ構造を定義する方法を見てみましょう。構文 #includemap<data_type1,data_type2>myMap; これを行う方法を確認するための例を見てみましょう-例 #incl

例として辞書内のnull値を削除するPythonプログラム 例として辞書内のnull値を削除するPythonプログラム Sep 03, 2023 pm 04:45 PM

辞書はコレクション データ型として知られています。データはキーと値のペアの形式で保存されます。それらは順序付けされ、変更可能です。つまり、特定の順序に従い、インデックスが付けられます。キーの値を変更して、操作または変更できるようにすることができます。辞書はデータの複製をサポートしていません。各キーには複数の値を関連付けることができますが、1 つの値に複数のキーを含めることはできません。辞書を使用して多くの操作を実行できます。メカニズム全体は保存された値に依存します。この記事では、辞書から「NULL 値」を削除するために使用できるテクニックについて説明します。主要な操作を開始する前に、ディクショナリでの値の処理について深く理解しておく必要があります。この記事の概要を簡単に見てみましょう。この記事は 2 つのパートに分かれており、パート 1 では「NULL 値」の概念とその重要性に焦点を当てます。パート2では

C# における一般的な同時コレクションとスレッド セーフティの問題 C# における一般的な同時コレクションとスレッド セーフティの問題 Oct 09, 2023 pm 10:49 PM

C# における一般的な同時コレクションとスレッド セーフティの問題 C# プログラミングでは、同時操作の処理は非常に一般的な要件です。スレッド セーフティの問題は、複数のスレッドが同時に同じデータにアクセスして変更する場合に発生します。この問題を解決するために、C# はいくつかの同時コレクションおよびスレッド セーフ メカニズムを提供します。この記事では、C# の一般的な同時コレクションとスレッド セーフティの問題に対処する方法を紹介し、具体的なコード例を示します。同時コレクション 1.1ConcurrentDictionaryConcurrentDictio

See all articles