2つのテキストボックスを持つグリッドで構成されるアイテムテンプレートであるListViewに辞書をバインドしようとしています。理想的には、ListViewに表示されるKeyValuePairのキーと値の両方を変更できるようにしたいと思います。それは可能ですか?
2 に答える
あなたが探しているのはObservableCollection<T>
、辞書に似たものです。少しグーグルすると、WPF博士から次のことがわかりましたObservableDictionary
。
長所と短所
もちろん、監視可能なディクショナリを使用する利点は、ディクショナリがデータバインドコントロールのItemsSourceとして機能し、他のディクショナリにアクセスするのと同じ方法でコードでディクショナリにアクセスできることです。これは、実際にはオブジェクトのインデックス付き辞書です。辞書を観察可能にするという考えそのものに固有のいくつかの制限が確かにあります。辞書はスピードを重視して作られています。フレームワークがディクショナリにバインドできるように、ディクショナリに監視可能なコレクションの動作を課すと、オーバーヘッドが追加されます。
また、ディクショナリは、同じ名前の個別のプロパティを介してそのコレクション
Values
とコレクションを公開します。Keys
これらのコレクションは、それぞれタイプDictionary<TKey, TValue>.ValueCollection
とDictionary<TKey, TValue>.KeyCollection
、です。これらのCLR定義のコレクションは監視できません。そのため、ValuesコレクションまたはKeysコレクションに直接バインドして、動的なコレクション変更通知を受け取ることを期待することはできません。代わりに、監視可能なディクショナリに直接バインドする必要があります。
ここで、キーの更新で問題が発生する可能性があります。これは、辞書にアイテムを移動するように説得する必要があるためです。Dr. WPFObservableDictionary
を使用し、代わりにをKeyedCollection
バッキングストアとして使用することをお勧めします。このように、キーはアイテム自体から派生し、更新によってオブジェクトがObservableDictionary
自動的に移動されます。
KeyValuePairの実装を見ると、キーと値の両方を読み取り専用プロパティとして持つ構造体であるため、この場合は TwoWay バインディングを作成できないと思います。
INotifyPropertyChange を継承するクラスを作成して、キーを変更したときにディクショナリの追加および削除項目を処理したり、値を変更するときに値のみを変更したりすると、おそらく機能します。