2013-05-20 3 views
2

Я реализовал интерфейс INotifyPropertyChanged для простых WPF показов ViewModel и когда я называю моегоPropertyChanged назначение метода

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

на множестве GoodText как

this.RaisePropertyChanged("GoodText"); 

это событие PropertyChanged имеет метод, Я никогда не назначался.

Когда оно было назначено? Кто сделал это?

EDIT:

Спасибо, большие советы, но я думаю, что ответ Виллема это то, что я искал, я имею в виду: когда я говорю

<Button Content="Button" Command="{Binding CheckButtonCommand}" /> 

Это что-то вроде (некрасиво псевдокод)

PropertyChanged += Button.GiveMeThePropertyValue; 

? Итак, привязка добавила обработчик события PropertyChanged?

+0

Исправить. Связывание добавляет обработчик, поэтому он может быть уведомлен об обновлениях и действовать соответствующим образом. Это способ связывания MVVM. Объект, который привязан, должен знать только об INotifyPropertyChanged, чтобы получать уведомления об обновлениях (и/или INotifyCollectionChanged для обновлений коллекции). –

ответ

1

Скорее всего, собственность (a nd, таким образом, класс) являются данными, связанными в XAML (или через код).

Если вы связываетесь с классом, реализующим INotifyPropertyChanged, UIElement, связанный с исходным классом, подключит обработчик событий, чтобы иметь возможность отслеживать изменения свойств.

1

Это волшебство «полевых событий» и волшебство делегатов.

Во-первых, похожие на поле события: внешнему абоненту, они выглядят как event - с add/remove accessors; их можно использовать только с +=/-=. Однако к объявляющему типу они больше похожи на поле - так что у вас есть прямой доступ к делегату. Включая чтение и присвоение значения.

Сведения о том, откуда пришел метод. Это (вид) , что делегат. Это фактически .Invoke(...) на экземпляре делегата; но неявный .Invoke. Это происходит из-за любой делегат, например:

Action<string> action = s => Console.WriteLine(s); 
// following are identical (but with different values, obviously) 
action("hello"); 
action.Invoke("world"); 

Несколько предложений, хотя:

1: есть действительно крошечное unlikley к укусу вы нить гонки на данный момент; Я предлагаю:

var handler = PropertyChanged; 
if(handler != null) handler(this, ...); 

2: с недавних компиляторов, вы можете избежать буквальное:

protected void RaisePropertyChanged([CallerMemberName] string propertyName=null) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

, который позволяет вызывать его из GoodText собственности просто:

this.RaisePropertyChanged(); 

Меньше code = меньше ошибок (имена для копирования/вставки и т. д.)

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