我使用INotifyPropertyChanged
来通知类,当其中的特定对象的变量发生任何变化时。
下面是类:
public class MyClass
{
public SecClass MyObj { get; set; }
//A few more variables
}
SecClass:
public class SecClass:INotifyPropertyChanged
{
private bool _noti= false;
public bool Noti
{
get { return _noti; }
set
{
_noti= value;
NotifyPropertyChanged("Noti");
}
}
//A few more variables
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
这是我的函数,使事件注册:
public void Register()
{
MyObj.PropertyChanged += MyObj_PropertyChanged;
}
函数工作,注册完成,但当涉及到改变它显示Property Change
为空(我猜,在某个地方注册删除,发生变化之前,我怎么能检查这个?)
我用:
static class Program
{
static void Main()
{
var c = new MyClass();
c.MyObj = new SecClass();
c.Register();
c.MyObj.Noti = !c.MyObj.Noti;
}
}
添加(插图):
private void MyObj_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine(e.PropertyName);
}
to MyClass
, and
public event PropertyChangedEventHandler PropertyChanged;
到SecClass
(让它们编译),它工作得很好-在运行时打印"Noti"
。是理论上的线程竞争,但在任何正常的用法中都非常不太可能,但推荐的用法是:
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
同样,对于info:如果你添加了[CallerMemberName]
,你不需要显式地指定属性:
private void NotifyPropertyChanged([CallerMemberName] string name = null) {...}
:
NotifyPropertyChanged(); // the compiler adds the "Noti" itself
但从根本上说:"不能复制"-它工作得很好。我想知道它是否与你的PropertyChanged
实现有关,因为你实际上并没有显示出来。特别是,我想知道您是否实际上有两个事件:一个显式实现。这就意味着你的演员会对它进行不同的处理。