2012-01-10 2 views
0

У меня есть очень простой класс, который имеет одно свойство и которое наследует INotifyPropertyChanged:Инстанцирование класс, который наследует 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")); 
     } 
    } 
} 

Я пытаюсь создать экземпляр объекта SimpleClass в конструкторе для WPF окна, но я получаю после TargetInvocationException: «Исключение выбрано целью вызова». Если я удалю наследование INotifyPropertyChange (и любую ссылку на событие PropertyChanged), то я не получаю ошибку, и мой проект работает без каких-либо проблем. Любые идеи почему?

Приветствия

ответ

4

Вы не проверяла на нуль PropertyChanged.

Если никто не слушает, тогда это будет null. большинство людей защищают для слушателей событий, чтобы изменить во время мероприятия, а также:

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

Да хороший улов. это будет исключение, вызванное тем, что листеры являются нулевыми. – Dessus

+0

Спасибо! Кстати, почему вы использовали слушателей, а не PropertyChanged, как ответ Криса Шаина ниже? – SuMau

+0

это очень распространенный шаблон, даже msdn *, как реализовать ... * делает это так: http://msdn.microsoft.com/en-us/library/ms743695.aspx. Я * слышал *, что если вы делаете многопоточность, свойство PropertyChanged * может * меняться между 'if' и блоком кода внутри. локальное значение не может. –

0

Попробуйте удалить скобки() после имени класса:

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")); 
     } 
    } 
} 
1

Ничто в настоящем Кодексе не очевидно, вызывает эту ошибку , Нам нужно больше информации, чтобы быть уверенным, что происходит. Однако подсказки, которые вы дали об INotifyPropertyChanged, заставили меня поверить в то, что ваше событие PropertyChanged равно null, и у вас нет нулевой проверки. Вы либо должны добавить нулевой проверки:

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

или убедитесь, что событие никогда не нуль:

public event PropertyChangedEventHandler PropertyChanged = (s, e) => { }; 
Смежные вопросы