c#通过事件处理程序检查字典是否更改了另一个类中的值
本文关键字:另一个 是否 事件处理 程序 字典 检查 | 更新日期: 2023-09-27 18:18:39
我有一个单独的类,比方说class2,它有一个字典。我想让它用值填充字典。
public class Class2
{
public Class2()
{
public Dictionary<string, string> someDictionary = new Dictionary<string, string>();
//I DON"T KNOW HOW TO CREATE AN EVENTHANDLER HERE FOR THE DICTIONARY
//how do i create the eventhandler if someDictionary changes?
}
}
假设在class1中,我有一个列表视图,我想用字典值填充它,但是随着class2中的字典的变化而改变它们。
public class Class1
{
public Class1()
{
Class2 class2 = new Class2();
class2.SomeDictionaryChanged += new EventHandler(someDictionary_SomeDictionaryChanged);
}
void someData_SomeDataChanged(object sender, EventArgs e)
{
listView1.Add(class2.someDictionary);
}
}
如何为class2中的字典创建事件处理程序,以及如何检查class1中的字典是否更改?
所有这些都是伪代码,它不会编译,我不知道怎么做,所以我问这个问题。
查看ObservableDictionary。http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/12/26/observabledictionary-lt-tkey-tvalue-gt-c.aspx
实现了INotifyCollectionChanged和INotifyPropertyChanged。你可以处理CollectionChanged从一个字典更新另一个。
我还没有测试过这段代码,但它应该能让你找到正确的方向。
public class Class2 : ObservableDictionary<string, string>
{
public Class2()
{
}
}
public class Class1
{
public Class1()
{
Class2 class2 = new Class2();
class2.CollectionChanged += new OnCollectionChanged;
}
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (KeyValuePair<string, string> kvp in e.NewItems)
{
listView1.Add(kvp.Value);
}
}
}
}
class1扩展了可观察对象字典,它有CollectionChanged事件。在class1中,您可以附加到class2的CollectionChanged事件,并使用它向listview添加项目。
从仅使用字典的角度来看,这是不可能的。
原因如下:
-
Dictionary<TKey, TValue
没有任何事件 - 比较两个具有相同
Tkey
和TValue
类型和相同内容的Dictionary<TKey, TValue>
对象,将比较false
,因为.Equals(x)
在这样的字典上使用引用比较 - 通过
.GetHashCode()
检查哈希码也将不起作用,因为两个不同字典实例的哈希码可能不同,即使字典具有相同的内容。
让这样的东西工作的唯一方法是:
- 子类化
Dictionary<TKey, TValue>
并在改变字典的所有事情上触发事件(注意,我真的不记得字典类型是否密封,即。 - 包装对底层字典的所有访问,并在适当的位置触发事件