WPF - 如何使用键(如字典)实现ObservableCollection <k,t>?</k,t>

时间:2010-09-29 02:31:13

标签: c# .net wpf observablecollection

我使用带有WPF的ObservableCollection进行绑定,这很有效。我现在真正想要的是像一个字典,它有一个我可以使用的键,所以有效地像“ObservableCollection”。

您能否建议可用于提供此类ObservableCollection的代码?我的目标是拥有一个类似于Dictionary的结构,我可以从WPF绑定它。

由于

5 个答案:

答案 0 :(得分:5)

Someone already made it。我还没有尝试,但没有什么可失去的。

答案 1 :(得分:1)

创建一个实现IDictionary的类,INotifyCollectionChanged&amp; INotifyPropertyChanged接口。该类将具有一个Dictionary实例,它将用于实现IDictionary(其中一个Add方法在下面作为示例编写)。 INotifyCollectionChanged和INotifyProperyChanged都需要存在事件,这些事件应该在包装函数的适当位置触发(同样,请参考下面的Add方法获取示例)

class ObservableDictionary<TKey, TValue> : IDictionary, INotifyCollectionChanged, INotifyPropertyChanged
{
    private Dictionary<TKey, TValue> mDictionary;
    // Methods & Properties for IDictionary implementation would defer to mDictionary:
    public void Add(TKey key, TValue value){
        mDictionary.Add(key, value);
        OnCollectionChanged(NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, value)
        return;
    }
    // Implementation of INotifyCollectionChanged:
    public event NotifyCollectionChangedEventHandler CollectionChanged;
    protected void OnCollectionChanged(NotifyCollectionChangedEventArgs args){
        // event fire implementation
    }
    // Implementation of INotifyProperyChanged:
    public event ProperyChangedEventHandler ProperyChanged;
    protected void OnPropertyChanged(PropertyChangedEventArgs args){
        // event fire implementation
    }
}

编辑:

请注意,直接或间接实现IDictionary接口需要实现三个额外的接口:

ICollection<KeyValuePair<TKey,TValue>>
IEnumerable<KeyValuePair<TKey,TValue>>
IEnumerable.

根据您的需要,您可能不必实现整个IDictionary接口,如果您只是要调用几个方法,那么只需实现这些方法,IDictionary接口就变得很奢侈了。您必须实现INotifyCollectionChanged和INotifyPropertyChanged接口以便绑定才能正常工作.Blockquote

答案 2 :(得分:1)

{{1}}

我覆盖添加,删除和清除。你必须明白,如果你使用扩展方法或简单方法,它采取Dictionary参数,你不会看到改变,因为在这种情况下,Add或Remove方法将使用Dictionary(而不是ObservableDictonary)。因此,您必须指导ObservableDictonary

的方法(添加或删除)

答案 3 :(得分:1)

怎么样:

var collection = new ObservableCollection<KeyValuePair<TKey, TValue>>();

您应该可以通过以下方式解决该问题:

collection.First(x => x.Key == *your key value*) 。键或.Value

答案 4 :(得分:0)

如下:

ObservableCollection<Tuple<string, object>>()

其中字符串和对象以及样本类型