2015-06-14 2 views
0

У меня довольно простая проблема, но у меня болит голова, и я трачу слишком много времени. В любом случае у меня кончились идеи :) По какой-то причине я не могу передать значение моей переменной свойства в свой обработчик событий. Вот что у меня есть, для меня все в порядке, но это не будет работать :( enter image description here enter image description hereПочему мой обработчик событий null?

Любая идея, почему это не передавая текущее значение переменной? Заранее спасибо :)

+0

Вы назначили обработчик этому событию в любом месте? – MadOX

+0

Что значит «фактическое значение переменной»? Мы можем ясно видеть, что строка «Перемещения» была передана методу 'onPropertyChanged'. Заголовок вопроса указывает, что вам интересно, что событие является нулевым, можете ли вы выяснить, что именно проблема здесь? Обработчик события имеет значение null, потому что никто не добавил к нему обработчик событий. –

ответ

0

Как следует из названия, propertyName должно содержать название объекта, а не значение. Также см. PropertyChangedEventHandler и PropertyChangedEventArgs на MSDN для получения более подробной информации.

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

obj.PropertyChanged += new PropertyChangedEventHandler(obj_PropertyChanged); 

private void obj_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    .... 
} 

тогда, когда obj.Moves изменения obj_PropertyChanged будет называться.

Я понимаю ваше замешательство, поэтому позвольте мне дать немного больше объяснений. Предположим, у вас есть два класса: A и B; и вы хотите B быть уведомлены, если изменено свойство A. После этого вы можете сделать A реализовать INotifyPropertyChanged и сделать B подписаться на событие PropertyChanged из A, как следующее:

public class A: INotifyPropertyChanged 
{ 
    private int moves; 
    public int Moves 
    { 
    get { return moves; } 
    set 
    { 
     if (value != moves) { 
     moves = value; 
     OnPropertyChanged("Moves"); 
     } 
    } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class B 
{ 
    private A a = new A(); 

    public B() 
    { 
    a.PropertyChanged += new PropertyChangedEventHandler(a_PropertyChanged); 
    } 

    private void a_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
    .... 
    } 
} 

с вышеизложенным, B.a_PropertyChanged будет вызываться всякий раз, когда A.Moves изменяется. Точнее, если b является экземпляром B, тогда b.a_PropertyChanged будет вызываться всякий раз, когда изменяется b.a.Moves. Также обратите внимание, как моя реализация установщика Moves отличается от вашей.

+0

Это интерфейс INotifyPropertyChanged, поэтому вы вызываете его в установщике объекта. Класс, который его реализует, автоматически подписывается на него. –

+0

@Tomasz_S см. Мое редактирование. – ycsun

Смежные вопросы