为什么我的事件处理程序为null?

时间:2015-06-14 08:26:28

标签: c# events delegates inotifypropertychanged

我有一个非常简单的问题,但让我头痛,我浪费了太多时间。无论如何我已经没想完了:) 出于某种原因,我无法将我的属性变量的值传递给我的事件处理程序。这是我得到的,对我来说一切都很好,但它不会工作:( enter image description here enter image description here

知道为什么它没有传递变量的实际值?在此先感谢:)

1 个答案:

答案 0 :(得分:0)

顾名思义,propertyName应该包含属性的名称,而不是值。有关详情,请参阅MSDN上的PropertyChangedEventHandlerPropertyChangedEventArgs

至于为什么你的事件处理程序null,我怀疑你还没有订阅它。您应该在程序中的某处具有以下内容:

obj.PropertyChanged += new PropertyChangedEventHandler(obj_PropertyChanged);

private void obj_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
  ....
}

然后当obj.Moves更改obj_PropertyChanged时会被调用。

我理解你的困惑,所以让我再解释一下。假设您有两个类AB,并且希望在B的属性发生更改时通知A。然后,您可以A实现INotifyPropertyChanged,并使B订阅A的PropertyChanged事件,如下所示:

public class A: INotifyPropertyChanged
{
  private int moves;
  public int Moves
  {
    get { return moves; }
    set
    {
      if (value != moves) {
        moves = value;
        OnPropertyChanged("Moves");
      }
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private void OnPropertyChanged(string propertyName)
  {
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}

public class B
{
  private A a = new A();

  public B()
  {
    a.PropertyChanged += new PropertyChangedEventHandler(a_PropertyChanged);
  }

  private void a_PropertyChanged(object sender, PropertyChangedEventArgs e)
  {
    ....
  }
}

通过上述内容,只要B.a_PropertyChanged发生更改,就会调用A.Moves。更确切地说,如果bB的实例,则只要b.a_PropertyChanged发生更改,就会调用b.a.Moves。另请注意我的Moves设置器的实现与您的实现有何不同。