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

时间:2011-12-23 22:43:58

标签: c# dictionary event-handling

我有一个单独的类,比方说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中,我有一个listview,我想填充字典值,但更改它们,因为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中为字典创建一个eventhandler,如何检查class1中的字典是否发生变化?

所有这些都是PSEUDOCODE,它不会编译,我不知道怎么做,这就是我在问这个问题。

2 个答案:

答案 0 :(得分:6)

查看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事件,并使用它将项目添加到列表视图中。

答案 1 :(得分:0)

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

原因如下:

  1. Dictionary<TKey, TValue没有任何活动
  2. 比较具有相同Dictionary<TKey, TValue>Tkey类型以及相同内容的两个TValue个对象,将与false进行比较,只是因为.Equals(x)在这样的字典上使用参考比较
  3. 通过.GetHashCode()检查哈希码将无效,因为两个差异字典实例的哈希码可能不同,即使字典具有相同的内容。
  4. 让这样的事情发挥作用的唯一方法是:

    1. 子类化Dictionary<TKey, TValue>并在更改字典的所有内容上触发事件(请注意,我不记得字典类型是否已密封,即是否真的可以实现)
    2. 包装对基础词典的所有访问权限,并在适当的位置触发事件