【问题标题】:How isn't propertyChanged null although we don't initialize it?尽管我们没有初始化它,但 propertyChanged 怎么不是 null 呢?
【发布时间】:2020-11-12 01:57:13
【问题描述】:

在 Xamarin.Forms 上,我实现了 INotifyPropertyChanged,它工作正常。

虽然有一些我不明白的地方: PropertyChanged 是一个事件,这意味着它是一个委托。 在我们调用 event/delegate 之前,我们需要它们指向某个 function/eventHundler。

怎么回事,我们在这里声明了一个事件,我们没有将它设置为指向 任何功能,一切正常!怎么不为空,虽然我们从来没有初始化过。

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
   var changed = PropertyChanged;
    if (changed == null)   //It seems for me, this should be null for ever.  
       return;
     changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

【问题讨论】:

  • 如果有任何PropertyChanged事件的监听器,它不会为空。如果您使用此类进行数据绑定,则 UI 将自动订阅该事件。
  • 这个空检查不是你想象的那样。 “我们从未初始化它” - 事件不是属性或字段。当您定义 event 时,您实际上在多播委托之上定义了具有 add/remove 访问器的特殊属性,该访问器始终不为空。事件空值检查只是一种检查订阅者的方法,我从不担心它是如何实现的。
  • @Sinatr 就是这样。我没有为这个活动订阅任何人。这就是我除了 this 将始终为空的原因。
  • @S Itzik...您没有订阅它...是的...但是控件订阅了它。这就是绑定的工作原理。
  • PropertyChanged 事件很特别。 bindings 在内部使用它。如果绑定具有(取决于BindingMode)来监视源更改,那么在运行时它会尝试解决它可以使用哪些机制来实现这一点。如果它发现源实现了INotifyPropertyChanged,那么它将订阅PropertyChanged事件。所以在运行时它不会是null。在某些时候绑定会取消订阅,所以它会是null。

标签: c# events xamarin.forms inotifypropertychanged eventhandler


【解决方案1】:

表达式someEvent == null 将在事件未被订阅时返回true。您需要执行此检查,否则您可能会收到NullReferenceException。有关活动的更多信息,请查看documentation。

编辑:

Xamarin.Forms 的内部代码订阅您的事件。这样,当您调用事件时,Xamarin.Forms 就知道某些属性的值已更新,并且可以在表单中对其进行更新。

【讨论】:

  • @ 是的,我要说的是,我没有为任何人订阅此活动。因此(也如您所写)此事件应该为空......但它不是。
  • @SItzik Xamarin.Forms 的内部代码订阅您的事件。这样,当您调用事件时,Xamarin.Forms 知道某些属性的值已更新,并且可以在表单中更新它
  • @AWhiteFox,请edit 回答。这似乎是 OP 在问的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多