【问题标题】:How can I detect changes to item properties in the BindingList<T>?如何检测 BindingList<T> 中项目属性的更改?
【发布时间】:2009-03-17 17:05:25
【问题描述】:

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

我创建了一个类Foos : BindingList&lt;Foo&gt;

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

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

【问题讨论】:

    标签: c# .net collections


    【解决方案1】:

    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 应该自动连接到您的事件处理程序,并且您的 GUI 现在应该在您设置类调用 PropertyChanged 事件处理程序时更新。

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

    public void DoSomething()
    {
        BindingList<Foo> foos = getBindingList();
        foos.ListChanged += HandleFooChanged;
    }
    
    void HandleFooChanged(object sender, ListChangedEventArgs e)
    {
        MessageBox.Show(e.ListChangedType.ToString());
    }
    

    【讨论】:

    • 测试……我想这就是我要找的。​​span>
    • Foos 类中的什么事件会触发 PropertyChanged 处理程序?请记住,我需要在 Foos 类中做一些工作(主要是修改一些内部字典)。
    • 假设您的 Foo 类的实现方式与上面显示的相同。当任何类设置 Foo.SomeValue 属性时,Foo 实例将引发 PropertyChanged 事件处理程序。您可以(如果您愿意)直接在 Foo 实例上或通过 BindingList.ListChanged 连接到此事件处理程序。
    • 非常感谢公主。不过,我不能给你更多的支持:)
    • 请注意 NotifyPropertyChanged 在这种情况下不是线程安全的。这是正确的实现(使用局部变量):How to: Implement Property Change Notification
    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多