|
Модератор
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INPC (INotifyPropertyChanged) и получение данных из Модели [WPF, Элд Хасп]27.01.2019, 17:51. Показов 25287. Ответов 63
Метки c, incc, inotifypropertychanged, inpc, model, model-view-viewmodel, mv, mvvm, view, viewmodel, vm (Все метки)
Сообщение было отмечено Элд Хасп как решение
Решение
Тема из цикла Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
MVVM состоит из трёх раздельных частей. "Знания" этих частей друг о другу ограничены. View знает только о VM, VM только Model, а Model знать никого не желает. В такой схеме передача данных от View в Model проблем не вызывает. Ограничения есть только для передачи данных от View к VM. Для отправки данных View обращается к Set методу нужного свойства VM (к которому осуществлена привязка), поэтому привязывать свойства View можно только к публичным свойствам VM. Привязать к полям или методам VM невозможно. Если взять VM из примера в WPF команды и MVVM. Часть 1. пост#15, то свойства First, Second можно упростить до автосвойств и на функционировании приложения это ни как не скажется (сброс свойства Result в данном случае можно опустить)
Но как определить View, что данные изменились и их надо заново запросить? Для этого VM должна известить View о том какие данные были изменены. Это извещение (событие) для WPF View должно происходить через реализацию интерфейсов INotifyPropertyChanged (INPC) для свойств и INotifyCollectionChanged (INCC) для коллекций (здесь рассматривать не буду). Дефолтная реализация реализация интерфейса INPC состоит всего из одной строчки
OnPropertyChanged() равносильно OnPropertyChanged("Result")Но только такое использование INPC необязательно. Можно заменить Result на автосвойство и вызывать OnPropertyChanged при записи в него нового значения.
В VM при изменении значений свойств First, Second и SelectOperator будем отправлять в View сообщение об изменении свойства Result. А в свойстве Result пропишем обращение к свойствам Модели
Если для отправки извещения в View, VM должна реализовывать INPC или INCC, то модель этим не ограничена. Но использование этих интерфейсов в большинстве случаев удобно и позволяет сделать код более прозрачным и читаемым. Можно использовать INPC не совсем стандартно. По своей сути событие PropertyChanged пересылает просто текстовое сообщение (string), ни каких проверок на существование свойства с таким именем не производится. Поэтому не обязательно чтобы параметр метода OnPropertyChanged был названием свойства. В примере выше, VM обращается к методам Модели сразу возвращающим данные, но такие методы не всегда есть у модели. И если значения свойств First, Second и SelectOperator сразу посылать в Модель, то VM не может знать изменится Result или нет. Для этого при изменении Result Модель должна создать событие извещающее об этом, а VM "прослушивать" это событие и по нему запросить данные. Пример Модели. В Модели реализованы методы для получения данных от VM: First, Second и SelectOperator. Методы для возвращения данных в VM: GetResult и GetOperators. Для удобства введён дополнительный конструктор сразу подключающий "прослушку" события PropertyChanged. Имена методов Модели намеренно сделаны не совпадающими с именами свойств VM для большей наглядности взаимодействия. Для этой же цели PropertyChanged сообщает VM об изменении несуществующего свойства ResultChange
Инициализация Модели сделана через обращение к свойству для подключения прослушки чтобы не создавать конструктор ViewModel. В методе Model_PropertyChanged прослушивающем PropertyChanged проверяется имя свойства, если оно ResultChange, то отправляется извещение в View об изменении свойства Result. Пр обращении View к свойству Result оно получает своё значение от модели.
Кликните здесь для просмотра всего текста
Теперь к такой Модели можно подключить другие View и ViewModel Модель и первые View+VM почти те же. Добавлена только возможность ссылки на модель через статическое поле. Добавление в Модели
Кликните здесь для просмотра всего текста
Модель
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Во второй цепочке "Result" используется упрощённая VM и выводится только результат.
10
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 27.01.2019, 17:51 | |
|
Ответы с готовыми решениями:
63
Библиотека элементов для реализации WPF MVVM Решений [WPF, Элд Хасп]
Передача данных между Окнами, между VM, Шина Сообщений, Локатор [WPF, Элд Хасп] |
|
27 / 12 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
|
| 04.08.2023, 16:41 | |
|
Как я понял WPF передали в опенсорс, а поддержку в какое-то там подразделение, которое занимается поддержкой старых технологий. Если я правильно понял пересказ этой статьи https://medium.com/young-coder... 9ab0424e8c
Но опять же, та же активно развивающаяся Авалония по виду один в один WPF, только кросплотформенная и с вот такими удобностями, как в примере выше. Так что особо проблем в этом не вижу.
0
|
|
|
Модератор
|
||
| 04.08.2023, 16:45 [ТС] | ||
|
Я пробовал многие XAML-платформы. Если оценивать все возможности, то до WPF любой из них ещё десяток лет расти. Возьмите простейший DynamicResource. Проблема WPF - это "только Win DeskTop". А доля DeskTop уменьшается.
0
|
||
|
0 / 0 / 0
Регистрация: 23.07.2019
Сообщений: 19
|
|
| 26.04.2024, 12:49 | |
|
Как выполнить обновление значений во View вложенных свойств класса?
Допустим есть класс Phone со свойством Name. Phone реализует INPC, Name использует OnPropertyChanded() в сеттере. Во внешнем коде по вызову метода Button_Сlick меняю Name на что-то другое (phone.Name="Apple"), свойство в дебаггере меняется, а во View не обновляется.
0
|
|
|
Модератор
|
|
| 26.04.2024, 23:39 [ТС] | |
|
1
|
|
| 26.04.2024, 23:39 | |
|
WPF конвертеры [Элд Хасп]
WPF vs WinForms (для начинающих) [Элд Хасп] WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп] Обсуждение темы "Библиотека элементов для реализации WPF MVVM Решений" [WPF, Элд Хасп] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|