私はDictionary<string, MyClass>
を持っていて、その値をUI(WPFアプリケーション)に公開する必要があります。 MSDNによるとライブ辞書からobservablecollectionを作成する
this.MyList = new ObservableCollection(this.MyDictionary.Values)
:だから私はのObservableCollectionを作成しようとしました戻っDictionary<TKey, TValue>.ValueCollection
は静的なコピーではありません。代わりに、Dictionary<TKey, TValue>.ValueCollection
は、元のDictionary<TKey, TValue>
の値を参照します。したがって、Dictionary<TKey, TValue>
の変更は引き続きDictionary<TKey, TValue>.ValueCollection
に反映されます。
しかし、辞書に新しい項目を追加すると、変更は私の観察可能なコレクションに反映されません。
私は欲しいものをやり遂げることはできませんが、私が知らないことがあるかもしれません。
ソリューション
受け入れ答えは私がネイティブAPIとやりたいことができない、ある質問を答えたが、ここで私は自分のオブジェクトを構築しました方法です:
private class LivingHashedCollection<T>
{
private HashSet<T> _set;
private ObservableCollection<T> _list;
public ReadOnlyObservableCollection<T> Values { get; private set; }
public LivingHashedCollection()
{
_set = new HashSet<T>();
_list = new ObservableCollection<T>();
this.Values = new ReadOnlyObservableCollection<T>(_list);
}
public void AddValues(ICollection<T> values)
{
foreach (var val in values)
{
if (!_set.Contains(val))
{
_set.Add(val);
_list.Add(val);
}
}
}
}
最終的に、汎用の目的のために辞書の代わりにHashSetを選択しました。明らかに、この実装は改善することができます(例えば、IEnumerable、ICollectionを実装することができます)が、ここに基礎があります!
'RaisePropertyChanged'を使って 'リフレッシュ'してください –
MSDNが正しいかどうかは関係ありません。なぜそれに頼っているのですか?一度値をコピーしないとパフォーマンスが向上すると思いますか? –
'Values'は辞書の値を参照しますが、ObservableCollectionはコンストラクタに渡したすべての値をそれ自身の内部リストにコピーします。この時点から、元のコレクションから完全に切り離されています。 – Evk