WPF データ バインディングのコア テクノロジ
WPF の中核となる技術的利点の 1 つはデータ バインディングです。データ バインディングは、データ操作を通じてインターフェイスを更新できます。
データ バインディングに最もよく使用される 2 つのクラスは、ObservableCollection
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
したがって、今日私が提供するバージョンは、Dictionary
テストしましたが、バグはなく、パフォーマンスは優れています。コードは以下のとおりです:
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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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