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中的字典是否更改?

所有这些都是伪代码,它不会编译,我不知道怎么做,所以我问这个问题。

c#通过事件处理程序检查字典是否更改了另一个类中的值

查看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添加项目。

从仅使用字典的角度来看,这是不可能的。

原因如下:

  1. Dictionary<TKey, TValue没有任何事件
  2. 比较两个具有相同TkeyTValue类型和相同内容的Dictionary<TKey, TValue>对象,将比较false,因为.Equals(x)在这样的字典上使用引用比较
  3. 通过.GetHashCode()检查哈希码也将不起作用,因为两个不同字典实例的哈希码可能不同,即使字典具有相同的内容。

让这样的东西工作的唯一方法是:

  1. 子类化Dictionary<TKey, TValue>并在改变字典的所有事情上触发事件(注意,我真的不记得字典类型是否密封,即。
  2. 包装对底层字典的所有访问,并在适当的位置触发事件