Страницы

Поиск по вопросам

суббота, 27 апреля 2019 г.

MVVM для начинающих

Пытаюсь вникнуть в суть 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) Для этого во ViewModel реализуют (наследуют) от стандартного интерфайса INotifyPropertyChanged. В вашем примере используется один из вариантов такой реализации:
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(), чтобы передать название свойства)
///

/// Имя скачиваемого видео файла /// private string _NameFileVideo; public string NameFileVideo { get { return _NameFileVideo; } set { if (_NameFileVideo == value) return; _NameFileVideo = value; PropertyChanged(this, new PropertyChangedEventArgs(nameof(NameFileVideo))); } }

Комментариев нет:

Отправить комментарий