|
Модератор
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INPC (INotifyPropertyChanged) и получение данных из Модели [WPF, Элд Хасп]27.01.2019, 17:51. Показов 24940. Ответов 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, Элд Хасп] |
|
Модератор
|
||
| 03.08.2023, 15:13 [ТС] | ||
|
Исходные данные: небольшая многопользовательская БД, клиенты разбросаны по всей стране, у многих медленные каналы, много сложных запросов к БД. В таких условиях локальный кеш (актуальный) это хорошее решение.
0
|
||
|
|
||
| 03.08.2023, 15:25 | ||
|
Я же предлагаю написать именно запросы SQL (хранимки с параметрами, UDF с параметрами, View для отчёта), которые находятся на сервере и позволят вести любые расчёты сервером СУБД (уж математику то он осилит, благо все функции есть) и выдавать только простенький набор данных, который надо будет просто показать пользователю и всё. Доступ к серверу у человека есть, он сам об этом писал.
0
|
||
|
Модератор
|
||
| 03.08.2023, 16:07 [ТС] | ||
|
Делать к нему запросу через LINQ или SQL - это уже вторично.
0
|
||
|
|
||
| 03.08.2023, 16:19 | ||
А на предложение что можно все расчёты отдать на сервер СУБД он ответил что у него не расчётный сервер, а какая-то простенькая машинка. Тут стало ещё понятнее, что автор не до конца понимает что такое сервер СУБД. Вот я и пытаюсь объяснить что это не просто таблички с данными, это еще и мощная программа, которая умеет не только данные хранить... И эта программа должна работать и облегчать работу клиента до минимальных манипуляций с данными, для этого у неё есть все инструменты...
0
|
||
|
27 / 12 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
||||||||||||
| 03.08.2023, 17:42 | ||||||||||||
|
Весь день отвлекают, ответить не дают)
2. Пользователь должен видеть всё доступное оборудование, у него должна быть возможность в любой момент кликнуть\посмотреть\добавить любое оборудование из всех таблиц. ![]() Ну ок. Как я понимаю работает одинаково, но идея и способ взаимодействия разные. Ну и ObservableCollection используются что бы View обновлять проще было. Ну и в целом - зачем? Как уже написал - работаю я ~1000 полей во всех таблицах, получаю я их с сервера за время меньшее времени пинга, C# код преобразует их как угодно за наносекунды. Это не значит, что я не делаю выборок на сервере - ещё как делаю (из таких же таблиц на миллионы элементов), просто финальная выборка - это то, с чем будет работать пользователь, при том есть вероятность что он будет работать прям вообще со всем полученным. Грубо говоря - я получил 10-30 таблиц по 100-200 полей, "что-то" со всеми ними сделал - отправил назад. Я не понимаю зачем мне дергать сервер пока я "что-то" с ними делаю, это приведет к крайне долгому ожиданию ответа при каждом действии. Мне в целом нравится, какие-то особо уникальные запросы я делать не планирую (и уж тем более писать математику на сервере), а в плане простых вещей вида Select From Where Left|Right Join думаю оно всё одинаково должно работать по скорости, если понимать как оно работает и что вытягивает. Ну или использовать всякие там разделенные запросы и прочие улучшатели запросов.
0
|
||||||||||||
|
|
||
| 03.08.2023, 17:48 | ||
|
0
|
||
|
27 / 12 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
|||
| 03.08.2023, 17:52 | |||
|
Добавлено через 4 минуты Пусть уж подождет пинг + 30-100мс при открытии окна и подгрузке данных, а дальше мгновенно со всем работает.
0
|
|||
|
|
|
| 03.08.2023, 17:52 | |
|
werymag, Ну смотрите сами... Я вам советую как лучше, но вы сам себе хозяин...
0
|
|
|
27 / 12 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
||
| 03.08.2023, 17:56 | ||
|
0
|
||
|
|
||||
| 03.08.2023, 17:58 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
|
||||||||||||
| 04.08.2023, 09:16 | ||||||||||||
|
И по поводу расчётов. Вот смотрите
![]() Или допустим вот такой отчёт нужно получить, в котором берутся данные удовлетворяющие разным условиям и потом, после их обработки, ещё связываются с разными таблицами.
И по поводу математики - Математические функции (Transact-SQL). Хватит на все случаи жизни... Добавлено через 19 минут werymag, И плюс такого подхода в том, что при неизменных параметрах и результирующих наборах данных при изменении логики расчётов не нужно пересобирать приложение. Изменил на сервере хранимку, UDF, View и опять всё работает. Пользователи даже не замечают этого.
0
|
||||||||||||
|
Модератор
|
|||
| 04.08.2023, 10:22 [ТС] | |||
|
Он же уже раз десять написал, что у него совершенно другие условия задачи: Результатом обработки является SQL запрос на выборку из большого набора данных. Вся БД под 1000k записей не грузится память. С ней работают через настроенные SQL запросы.
1
|
|||
|
|
||
| 04.08.2023, 10:33 | ||
|
Я ему говорю про плюсы использования и знания SQL, отвечаю на его сомнения по поводу реализации, привожу примеры, которые при его подходе нормально не сделать... А решать ему
0
|
||
|
Модератор
|
||
| 04.08.2023, 10:49 [ТС] | ||
|
werymag, если правильно понял все условия вашей задачи, то у вас модель - это DbContext.
Вся остальная логика находится в VM. Задачи по абстракции View и БД у вас даже в далёкой теоретической перспективе нет. По большому счёту даже нет смысла в разделении View, Model, VM по разным проектам. По сути у вас получается Решение только из Представления. Да, это по факту будет легаси код, но конкретно в вашей задаче, в заданных вам условиях для её выполнения это будет оптимальным. Единственно, что я бы изменил - это не "ручной" парсинг таблиц в ObservableCollection, а использование Local из DbContext. LocalView<TEntity>.ToObservableCollection Method Добавлено через 2 минуты А для его задачи ваши примеры не подходят.
1
|
||
|
|
||
| 04.08.2023, 11:20 | ||
![]() Потому я решил показать что можно сделать, а использовать это или нет решаем не мы...
0
|
||
|
27 / 12 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
||||||||||||
| 04.08.2023, 16:26 | ||||||||||||
И кстати, в штатном WPF можно как-то сделать так же? Просто уж очень раздражает совершенно лишний одинаковый код с ICommand.
0
|
||||||||||||
|
|
|
| 04.08.2023, 16:29 | |
|
0
|
|
|
Модератор
|
|||
| 04.08.2023, 16:31 [ТС] | |||
|
Я отталкиваюсь от его объяснений. И такое вполне может быть. Я делал торгового бота, в котором большой объём данных скачивался при запуске. Потом по ним формировалось множество простых запросов к другим данным на сервере. Смысла формировать такое же множество сложных запросов не было никакого. Это ещё при том что был нормальные коммерческий сервер и сети. А ТС пишет что он лишён и того, и другого. Добавлено через 2 минуты Такая "отправка на пенсию" - это маркетинговый ход.
1
|
|||
|
27 / 12 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
|||
| 04.08.2023, 16:36 | |||
|
Статья, как я понял, от одного из разработчиков. Этож не WPF, это Avalonia. Добавлено через 1 минуту
0
|
|||
|
Модератор
|
|||
| 04.08.2023, 16:39 [ТС] | |||
|
"Стандартный" может привязываться только к свойствам.
0
|
|||
| 04.08.2023, 16:39 | |
|
WPF конвертеры [Элд Хасп]
WPF vs WinForms (для начинающих) [Элд Хасп] WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп] Обсуждение темы "Библиотека элементов для реализации WPF MVVM Решений" [WPF, Элд Хасп] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|