java #c# #wpf #mvvm
#java #c# #wpf #mvvm
Вопрос:
Я.Разработчик Net и недавно разговаривал с моим приятелем, который является разработчиком Java.
Я объяснял о WPF MVVM и о том, как, если вы хотите, чтобы свойство обновлялось в представлении, вы должны не только привязать его к данным, но и запустить обработчик событий «OnPropertyChanged».
Он был шокирован, что для этого нет готовых оболочек. Например, он сказал мне, что в Java есть «Наблюдаемая строка», которая автоматически знает, что нужно обновить значение в представлении, если оно изменено в серверной части.
(Я знаю о наблюдаемых коллекциях, но даже им должен быть явно предоставлен обработчик событий для вызова при изменении коллекции)
Он утверждает, что эти «наблюдаемые» в Java не нуждаются в какой-либо специальной настройке и не нуждаются в вызове обработчиков событий, по умолчанию они обновляют представление только после объявления / инициализации.
Есть ли что-то подобное в WPF MVVM, я делал это неправильно или это вообще не так в Java?
Комментарии:
1. Множество фреймворков делают это reactiveui.net
2. Ваш приятель использовал
RxJava
, он реализован на нескольких языках. Вы можете изучить это в reactivex.io/languages.html3. » наблюдаемые коллекции, но даже им должен быть явно предоставлен обработчик событий для вызова при изменении коллекции » — это заблуждение. Вы просто используете ObservableCollection вместо какого-либо другого типа списка. Элемент пользовательского интерфейса со свойством, привязанным к такой коллекции, автоматически зарегистрирует обработчик событий. Вам не нужно ничего делать вручную.
4. @Clemens, о, я подумал, что нам нужно предоставить обработчик для события «CollectionChanged».
Ответ №1:
Способ, которым WPF «автоматически узнает», когда обновлять целевое свойство, заключается в том, что исходный объект реализует INotifyPropertyChanged
интерфейс и вызывает PropertyChanged
событие для этого свойства. Вот как реализован механизм привязки.
Фреймворк не подписывается на некоторые другие «наблюдаемые» (что бы это ни значило в данном случае).
Итак, вы не ошиблись, если реализовали INotifyPropertyChanged
и вызвали PropertyChanged
событие в своих моделях представления.