Пытаюсь вникнуть в суть MVVM, рассматривая простейшие примеры и мне непонятны некоторые вещи,такие как:
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName]string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
Также непонятно как работает интерфейс INotifyPropertyChanged
Может ли кто-нибудь все это объяснить?
P.S. на MSDN и других сайтах был и читал,но понятнее не стало
Ответ
Попробую объяснить.
Между View(графический интерфейс программы (кнопки, текстовые поля, и проч.)) с помощью так называемого байдинга (кто-то называет биндинг, хотя это неправильное произношение) устанавливается связь со свойствами во ViewModel. Например с текстовым полем ввода мы связываем свойство (ViewModel) - public string Name { get; set; } с помощью записи в XAML (View)
public event PropertyChangedEventHandler PropertyChanged; - собственно само объявление нужного события.
public void OnPropertyChanged([CallerMemberName]string prop = "") - вспомогательный метод для вызова этого события из блока set;
[CallerMemberName] - атрибут у параметра, который позволяет не указывать название свойства программисту, компилятор сам подставит имя свойства, которое вызывает метод OnPropertyChanged, т.е. вы можете вызвать как OnPropertyChanged("Name") или же так OnPropertyChanged() и тогда ("Name") вместо вас подставит компилятор.
Далее в самом методе происходит проверка; а если ли у этого события подписчики? И в случае наличия таковых (у нас это
public class MainViewModel : INotifyPropertyChanged //не забываем о наследовании
Присваиваем в объявлении события пустой делегат, чтобы потом не заниматься проверкой, а если ли подписанты на событие? Они теперь всегда есть, по крайней мере один пустой подписант.
public event PropertyChangedEventHandler PropertyChanged = delegate { };
А вот пример свойства с вызовом этого события (использую новую конструкцию nameof(), чтобы передать название свойства)
///
Комментариев нет:
Отправить комментарий