Странное исключение NullReferenceException с реализацией INotifyPropertyChanged - PullRequest
6 голосов
/ 12 декабря 2011

Я реализую 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");

Я получаю исключение NullReferenceException, пока аргументы, "this" и обработчик НЕ равны NULL.Кто-нибудь может пролить свет на это?

Спасибо.

-> Полная трассировка стека исключения: http://pastebin.com/bH9FeurJ

ОБНОВЛЕНИЕ Исключение возникает, когдаЯ перезаписываю экземпляр класса, который содержит это свойство.Упрощенный пример:

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 для привязки данных кпользовательский интерфейс.Вторая и все последующие попытки приводят к NullReferenceException.

Ответы [ 3 ]

3 голосов
/ 12 декабря 2011

Исключение не вызывается в вашем примере кода, оно вызывается в одном из подписанных обработчиков событий.Пройдите через это шаг за шагом в отладчике или включите переключатель «Брошенный» для «Общих исключений времени выполнения» в меню «Отладка» - «Исключения» Visual Studio.Тогда вы сможете узнать причину.

1 голос
/ 03 мая 2015

У меня была эта ошибка какое-то время, однако теперь я ее исправил (хотя это может быть другая причина в моем коде) - я (довольно глупо) не проверял нулевое значение в одной из моих реализаций IValueConverter,(и по какой-то причине код не позволил бы мне войти в этот код) и вызвал исключение, поскольку в качестве значения было передано значение null.

1 голос
/ 12 декабря 2011

Глядя на трассировку стека, становится ясно, что NullReferenceException здесь вообще не выбрасывается; это на самом деле бросается глубже , в:

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

По сути, зависимость одного из слушателей событий ведет себя неправильно.

В сторону: я не был совершенно уверен, что вы используете соглашение о трассировке стека типа «растущий» или «растущий». Однажды я увидел, что метод чуть выше метода yoir был вызовом делегата:

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

... было ясно, что стек действительно растёт.

...