Страницы

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

среда, 5 февраля 2020 г.

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

#c_sharp #wpf #mvvm


Пытаюсь вникнуть в суть MVVM, рассматривая простейшие примеры и мне непонятны некоторые
вещи,такие как:

public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }


Также непонятно как работает интерфейс INotifyPropertyChanged
Может ли кто-нибудь все это объяснить?
P.S. на MSDN и других сайтах был и читал,но понятнее не стало
    


Ответы

Ответ 1



Попробую объяснить. Между View(графический интерфейс программы (кнопки, текстовые поля, и проч.)) с помощью так называемого байдинга (кто-то называет биндинг, хотя это неправильное произношение) устанавливается связь со свойствами во ViewModel. Например с текстовым полем ввода мы связываем свойство (ViewModel) - public string Name { get; set; } с помощью записи в XAML (View) /// Имя скачиваемого видео файла /// private string _NameFileVideo; public string NameFileVideo { get { return _NameFileVideo; } set { if (_NameFileVideo == value) return; _NameFileVideo = value; PropertyChanged(this, new PropertyChangedEventArgs(nameof(NameFileVideo))); } }

Ответ 2



Подозреваю, что основное, что вас пугает в этом коде - события. Не уверен, что получится понятно объяснить, но попробую провести аналогию. Каждый день в мире происходит множество событий, как глобальных так и локальных. Но о большинстве из них вы никогда не узнаете по той простой причине, что они вам не интересны. Вы хотите узнавать лишь те новости, которые важны для вас и ваших близких. Таким образом ставя "фильтр" вы подписываетесь только на интересующие вас события - например, на новости космонавтики. Тоже самое делает элемент управления вашего приложения через интерфейс INotifyPropertyChanged. Другими словами для элемента управления это и есть фильтр на тематику новостей от объекта. Если объект не реализовал интерфейс - значит он ему не интересен. Что касается привязки данных (Binding)...если проводить аналогию дальше, то это уже будет более конкретный фильтр (например, вас интересуют только новости с Марса). Так и элемент управления интересуется актуальными данными только от тех свойств объекта с которыми он непосредственно работает и он ничего не знает и не хочет знать обо все остальном что происходит в вашем классе. Когда вы изменяете значение свойства в коде - это уже событие. Но ни элемент управления, ни кто-либо другой об этом ничего не знает. Именно поэтому когда вы хотите "опубликовать" новость вы пишите: OnPropertyChanged("Название свойства") и тот элемент управления, который подписался на получение новостей об этом свойстве отреагирует должным образом. Атрибут CallerMemberName просто позволяет получить имя метода или свойства объекта, который вызывает метод. В данном случае используется, чтобы избежать возможных ошибок связанных с неправильным названием свойства для обновления.

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

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