2017-03-10 4 views
0

私は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を実装することができます)が、ここに基礎があります!

+0

'RaisePropertyChanged'を使って 'リフレッシュ'してください –

+0

MSDNが正しいかどうかは関係ありません。なぜそれに頼っているのですか?一度値をコピーしないとパフォーマンスが向上すると思いますか? –

+3

'Values'は辞書の値を参照しますが、ObservableCollectionはコンストラクタに渡したすべての値をそれ自身の内部リストにコピーします。この時点から、元のコレクションから完全に切り離されています。 – Evk

答えて

2

ObservableCollectionは、常にコンストラクタに渡すリストのコピーを作成します。これはいくつかの理由で行われましたが、主な目的は(私は)ObservableCollectionの主な目的はその内容の変更を追跡することですが、それはコンストラクタに渡す外部コレクションへの変更を追跡する方法がないため、 (CollectionChangedイベントを起こすことなく)。

関連する問題