我使用带有WPF的ObservableCollection进行绑定,这很有效。我现在真正想要的是像一个字典,它有一个我可以使用的键,所以有效地像“ObservableCollection”。
您能否建议可用于提供此类ObservableCollection的代码?我的目标是拥有一个类似于Dictionary的结构,我可以从WPF绑定它。
由于
答案 0 :(得分:5)
Someone already made it。我还没有尝试,但没有什么可失去的。
答案 1 :(得分:1)
创建一个实现IDictionary的类,INotifyCollectionChanged& 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>>()
其中字符串和对象以及样本类型