|
Модератор
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INPC (INotifyPropertyChanged) и получение данных из Модели [WPF, Элд Хасп]27.01.2019, 17:51. Показов 25059. Ответов 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, Элд Хасп] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|