INotifyPropertyChanged PropertyChangedEventHandler事件始终为null

时间:2011-02-20 16:17:03

标签: c# events .net-4.0 delegates inotifypropertychanged

我已将INotifyPropertyChanged实现到以下类

 public class FactoryItems : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        string symbol;
        public string Symbol
        {
            get { return symbol; }
            set { symbol = value; OnPropertyChanged("Symbol"); }
        }

        public FactoryItems()
        {

        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }

当Symbol属性更改时,事件触发没有问题,但PropertyChanged事件始终为null,此类仅实例化一次,我在构造函数上放置一个断点以确保它的大小写。

在另一个课程中,这是我订阅它的方式:

Data.Tables.FactoryItems = new Data.FactoryItems();
Data.Tables.FactoryItems.PropertyChanged += 
new System.ComponentModel.PropertyChangedEventHandler(FactoryItems_SymbolChanged);

void FactoryItems_SymbolChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
  doSomething();
}

但是,由于PropertyChanged为null,处理程序始终为null。知道如何让这个工作吗?

非常感谢。

4 个答案:

答案 0 :(得分:5)

您在一个特定实例上订阅该活动 这不会影响任何其他实例。

要查看所有实例的更改,您可以使用静态事件 请注意,任何订阅静态事件的类都将永远保留在内存中。

答案 1 :(得分:3)

在有人订阅该活动之前,它将保持null

答案 2 :(得分:1)

有各种类型可以订阅这个 - 最明显的是像DataGridView(winforms,但在WPF中类似),但在数据绑定时仅 (设置{{1}如果列表支持绑定,则,例如DataSource

要进行测试,只需使用BindingList<T>订阅自己。

答案 3 :(得分:0)

您只是在代码和调试中设置Symbol属性值吗?在这种情况下,没有任何人订阅PropertyChanged事件。

如果您正在进行XAML开发,请尝试将XAML元素的DataContext设置为FactoryItems类型的实例,然后将Symbol属性绑定到{{ TextBox上的属性(例如),您会发现XAML绑定引擎已订阅Text事件,因此它不会为空。

或者,只需手动订阅其他类型的PropertyChanged FactoryItems事件即可在代码中测试内容。