我已将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。知道如何让这个工作吗?
非常感谢。
答案 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
事件即可在代码中测试内容。