可观察字典的行为不符合预期

时间:2010-05-18 14:55:43

标签: c#

我希望将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"));
        }
    }
}

4 个答案:

答案 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),它实现了INotifyCollectionChangedINotifyPropertyChanged开箱即用。也许在反射器中查看它的实现可能会有所帮助?它可以在System.dll程序集中的System.Collections.ObjectModel命名空间中找到。