我有一个单独的类,比方说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,它不会编译,我不知道怎么做,这就是我在问这个问题。
答案 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)
从仅使用字典的角度来看,这是不可能的。
原因如下:
Dictionary<TKey, TValue
没有任何活动Dictionary<TKey, TValue>
和Tkey
类型以及相同内容的两个TValue
个对象,将与false
进行比较,只是因为.Equals(x)
在这样的字典上使用参考比较.GetHashCode()
检查哈希码将无效,因为两个差异字典实例的哈希码可能不同,即使字典具有相同的内容。让这样的事情发挥作用的唯一方法是:
Dictionary<TKey, TValue>
并在更改字典的所有内容上触发事件(请注意,我不记得字典类型是否已密封,即是否真的可以实现)