我希望将Dictionary设为'Observable',以便在项目更改时删除事件(删除或添加)。
在其他课程中,我创建了这样的字典并将Binding设置为ListBox.ItemsSourseProperty
绑定工作得很好。我可以看到这些物品。
但是出了点问题:事件PropertyChanged
始终为空。
有人可以帮忙吗?
提前致谢!
class ObservableDictionary<TKey, TValue> :
Dictionary<TKey, TValue>,
INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public new void Remove(TKey obj)
{
base.Remove(obj);
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Remove"));
}
}
}
答案 0 :(得分:5)
您不应该为PropertyChanged
调用集合更改事件。您需要实施INotifyCollectionChanged
。
答案 1 :(得分:3)
您订阅了PropertyChanged
活动吗?
var dictionary = new ObservableDictionary<int, int>();
dictionary.PropertyChanged +=
( sender, args ) => MessageBox.Show( args.PropertyName );
dictionary.Add( 1, 2 );
dictionary.Remove( 1 );
这适合我。
但实现接口IDictionary
而不是使用new
关键字会更清晰。然后,您可以在类中使用私有 Dictionary 实例来保护您自己实现所有内容的工作。
答案 2 :(得分:2)
是否有人订阅Propertychanged?
对于可观察的集合,您还需要INotifyCollectionChanged
答案 3 :(得分:2)
听起来您可能正在寻找ObservableCollection
的词典版本(请参阅:MSDN),它实现了INotifyCollectionChanged
和INotifyPropertyChanged
开箱即用。也许在反射器中查看它的实现可能会有所帮助?它可以在System.dll程序集中的System.Collections.ObjectModel命名空间中找到。