如何在BindingList <t>?</t>中检测项属性的更改

时间:2009-03-17 17:05:25

标签: c# .net collections

我有一个带有属性A和B的自定义类Foo。我想在数据绑定控件中显示它。

我创建了一个班级Foos : BindingList<Foo>

为了更新Foos类的一些内部属性,我需要在列表中的项目上通知属性更改(我可以处理插入,删除等)。您将如何实现该功能?

我应该从支持它的框架中的某个对象继承Foo吗?我想我可以创建一些事件,通知我是否有变化,但这是应该做的方式吗?或者框架中是否有一些模式可以帮助我?

1 个答案:

答案 0 :(得分:22)

Foo应该实现INotifyPropertyChangedINotifyPropertyChanging接口。

public void Foo : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private int _someValue;
    public int SomeValue
    {
        get { return _someValue; }
        set { _someValue = value; NotifyPropertyChanged("SomeValue"); }
    }
}

BindingList应自动挂钩到您的事件处理程序,并且只要您设置类调用PropertyChanged事件处理程序,您的GUI就会更新。

[编辑添加:]此外,BindingList类公开two events,在收集或修改集合时会通知您:

public void DoSomething()
{
    BindingList<Foo> foos = getBindingList();
    foos.ListChanged += HandleFooChanged;
}

void HandleFooChanged(object sender, ListChangedEventArgs e)
{
    MessageBox.Show(e.ListChangedType.ToString());
}