好的,所以我一直在寻找一个字典,当一段数据发生变化时会抛出一个事件。我遇到的其中一个链接是:http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/12/26/observabledictionary-lt-tkey-tvalue-gt-c.aspx
在检查IDictionary接口和Dictionary Class后,我可以清楚地看到CRUD(创建读取更新删除)。理论上所有词典都应该建立在这个功能上。
据我所知,实现一个可观察字典应该像
一样简单public class test<K,V> : Dictionary<K,V>, INotifyCollectionChanged, INotifyPropertyChanging
{
public event NotifyCollectionChangedEventHandler CollectionChanged;
public event PropertyChangedEventHandler PropertyChanged;
private const string pCount = "Count";
private const string pKeys = "Keys";
private const string pValues = "Values";
public V this[K key]
{
get
{
return base[key];
}
set
{
object old = base[key];
base[key] = value;
if (CollectionChanged != null)
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, new KeyValuePair<K, V>(key, value), new KeyValuePair<K, V>(key, (V)old)));
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(pValues));
}
}
public override void Add(K key, V value)
{
base.Add(key, value);
if(CollectionChanged!=null)
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, new KeyValuePair<K,V>(key, value)));
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(pCount));
PropertyChanged(this, new PropertyChangedEventArgs(pKeys));
PropertyChanged(this, new PropertyChangedEventArgs(pValues));
}
}
public override void Remove(K key)
{
object removed = base[key];
base.Remove(key);
if (CollectionChanged != null)
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, removed));
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(pCount));
PropertyChanged(this, new PropertyChangedEventArgs(pKeys));
PropertyChanged(this, new PropertyChangedEventArgs(pValues));
}
}
}
编辑:添加更多内容以使其更像样本并帮助澄清问题
我不明白为什么所有这些精心制作的词典都在制作中,有什么我想念的吗?有人可以向我解释一下吗?
感觉就像他们重新发明轮子一样,据我所知,这与可重复使用的代码相反,这是OO的要点。我真的觉得我必须遗漏一些东西。
答案 0 :(得分:2)
为什么你不能做你想做的事情有几个原因:
索引器,添加和删除方法不是虚拟的。您不能override
Add
或Remove
方法,因为它们不是虚拟的。
因为您没有覆盖这些方法,所以只要将对象键入为IDictionary
或Dictionary
,就不会触发这些方法。
通过使用组合而不是继承,如您链接的示例所示,给定字典对象的人无法在不触发事件的情况下添加项目,因为无法直接访问字典
答案 1 :(得分:1)
INotifyPropertyChanged
和INotifyCollectionChanged
的要点是它们被.Net自己的DataBinding使用(例如WPF和较小程度的winforms')。
您自己的自定义OnValueAdd
等代理人在您自己的课程之外是未知的,并且.Net的自动更改通知机制无法使用它们。