【问题标题】:Strange NullReferenceException with INotifyPropertyChanged implementation [duplicate]带有 INotifyPropertyChanged 实现的奇怪 NullReferenceException [重复]
【发布时间】:2011-12-12 14:41:47
【问题描述】:

我正在基类中实现 INotifyPropertyChanged,如下所示:

public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void RaisePropertyChanged(string propertyName)
    {
        var propChangedHandler = PropertyChanged;

        if (propChangedHandler != null)
        {
            var args = new PropertyChangedEventArgs(propertyName);
            propChangedHandler(this, args);
        }
    }
}

我是这样使用的:

RaisePropertyChanged("Name");

当参数“this”和处理程序不为空时,我得到了 NullReferenceException。任何人都可以对此有所了解吗?

谢谢。

-> 异常的完整堆栈跟踪:http://pastebin.com/bH9FeurJ

UPDATE 当我覆盖包含此属性的类的实例时会发生异常。简化示例:

public class Person : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            RaisePropertyChanged("Name");
        }
    }

// More properties etc.
}

-snip-

public class ViewModel
{
    private Person _dummyPerson;
    public Person DummyPerson
    {
        get { return _dummyPerson; }
        set
        {
            _dummyPerson = value;
            RaisePropertyChanged("DummyPerson");
        }
    }

    public void Foo()
    {
        DummyPerson = new DummyPerson(); 
        // this line throws the NRE, strangly enough the very FIRST time it works fine
    }
}

-snip-

我正在使用此 DummyPerson 及其 Name 属性将数据绑定到 UI。此后的第二次和所有后续尝试都会导致NullReferenceException

【问题讨论】:

  • 属性Name是否存在?
  • 这个问题有解决方案吗?我现在遇到了这个问题。
  • 不,我没有找到它,虽然我确定这是 IIS 中的一些问题 - 我最终从头开始重新安装整个操作系统:|

标签: c# .net mvvm nullreferenceexception inotifypropertychanged


【解决方案1】:

您的示例代码中没有引发异常,它是在订阅的事件处理程序之一中引发的。在调试器中一步一步过一遍,或者在Visual Studio的“调试”-“异常”菜单中打开“公共语言运行时异常”的“抛出”开关。然后你就可以找出原因了。

【讨论】:

  • 我无法深入代码,它会自动跳过。您提到的开关也打开并在上述行抛出错误。
【解决方案2】:

这个错误我已经有一段时间了,但是,我现在已经解决了它(尽管它可能是我的代码中的另一个原因) - 我(相当愚蠢地)没有在我的一个 IValueConverter 实现中检查 null, (由于某种原因,代码不允许我进入这段代码)并导致异常,因为 null 作为值传入。

【讨论】:

    【解决方案3】:

    查看堆栈跟踪,很明显NullReferenceException 根本没有被抛出;它实际上被抛出更深,在:

     GalaSoft.MvvmLight.Command.RelayCommand`1.Execute(Object parameter)
    

    本质上,事件侦听器之一的依赖性行为不端。

    除此之外:我不太确定您使用的堆栈跟踪约定是“向上”还是“向下”类型。一旦我看到 yoir 方法上方的方法是委托调用:

    System.ComponentModel.PropertyChangedEventHandler.Invoke(Object sender, PropertyChangedEventArgs e)
    

    ...很明显,堆栈确实在“向上”增长。

    【讨论】:

    • 是的,第一步(最深的)在顶部,而异常之前的最后一步在底部;来自 VS2010。
    猜你喜欢
    • 2017-08-08
    • 2020-11-04
    • 2011-12-19
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多