属性更改事件是空的,即使我注册了它

本文关键字:注册 事件 属性 | 更新日期: 2023-09-27 18:07:23

我使用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实现有关,因为你实际上并没有显示出来。特别是,我想知道您是否实际上有两个事件:一个显式实现。这就意味着你的演员会对它进行不同的处理。