【问题标题】:Instantiating a class that inherits INotifyPropertyChanged实例化一个继承 INotifyPropertyChanged 的​​类
【发布时间】:2012-02-06 11:55:22
【问题描述】:

我有一个非常简单的类,它有一个属性并且继承了 INotifyPropertyChanged:

class SimpleClass:INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string _property;
    public string Property
    {
        get { return _property; }
        set
        {
            _property = value; 
            PropertyChanged(this, new PropertyChangedEventArgs"Property"));
        }
    }
}

我尝试在 WPF 窗口的构造函数中实例化 SimpleClass 对象,但得到以下 TargetInvocationException:“调用的目标已引发异常”。 如果我删除 INotifyPropertyChange 继承(以及对 PropertyChanged 事件的任何引用),那么我不会收到错误消息并且我的项目运行没有任何问题。任何想法为什么?

干杯

【问题讨论】:

    标签: wpf inotifypropertychanged instantiation


    【解决方案1】:

    此代码中的任何内容显然都不会导致该错误。我们需要更多信息来确定发生了什么。但是,您提供的有关 INotifyPropertyChanged 的​​提示让我相信您的 PropertyChanged 事件为空,并且您没有围绕它进行空检查。您要么需要添加空检查:

        set
        {
            _property = value; 
            if (PropertyChanged != null)
              PropertyChanged(this, new PropertyChangedEventArgs"Property"));
        }
    

    或确保事件永远不会为空:

    public event PropertyChangedEventHandler PropertyChanged = (s, e) => { };
    

    【讨论】:

      【解决方案2】:

      尝试去掉类名后面的括号():

      public class SimpleClass:INotifyPropertyChanged
      {
          public event PropertyChangedEventHandler PropertyChanged;
          private string _property;
          public string Property
          {
              get { return _property; }
              set
              {
                  _property = value; 
                  PropertyChanged(this, new PropertyChangedEventArgs("Property"));
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        您没有在 PropertyChanged 上检查 null。

        如果没有人在听,那么它将为空。大多数人也会保护事件侦听器在事件期间发生变化:

        var listeners = PropertyChanged;
        if (listeners != null)
            listeners(this, new PropertyChangedEventArgs("Property");
        

        【讨论】:

        • 不错不错。这将是由于侦听器为空而导致的异常。
        • 谢谢!顺便说一句,你为什么像下面 Chris Shain 的回答那样直接使用侦听器而不是 PropertyChanged?
        • 这是一种非常常见的模式,即使是 msdn 如何实现... 也是这样做的:msdn.microsoft.com/en-us/library/ms743695.aspx。我听说如果你在做多线程的事情,属性 PropertyChanged 可以if 和里面的代码块之间改变。本地值不能。
        猜你喜欢
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-10
        • 2015-07-27
        • 1970-01-01
        • 2017-10-21
        • 1970-01-01
        相关资源
        最近更新 更多