|
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 47
|
|
WPF MVVM и INotifyPropertyChanged27.08.2019, 21:43. Показов 7543. Ответов 27
Метки нет (Все метки)
Здравствуйте. Начал разбираться с MVVM. И для меня непонятно в каких случаях нам нужно наследовать интерфейс INotifyPropertyChanged в model и в viewmodel, а в каких только в viewmodel?
0
|
|
| 27.08.2019, 21:43 | |
|
Ответы с готовыми решениями:
27
INotifyPropertyChanged
|
|
Модератор
|
||
| 27.08.2019, 21:43 | ||
Сообщение было отмечено Sirius1989 как решение
РешениеЗдесь возникает вопрос - при создании привязки из свойства было сосчитано значение и оно было отображено. А если значение изменилось, то как View об этом узнает? DP-свойства содержат механизм уведомления о изменении значения. А обычные свойства такого механизма не имеют. Для отслеживания изменения значений обычных свойств используется INPC. Поэтому все свойства VM предназначенные для привязки в View должны ОБЯЗАТЕЛЬНО уведомлять об изменении своих значений через INPC. Модели тоже возникает похожая ситуация. Но там нет уже обязательного условия использования INPC. Можно использовать другие механизмы и события. Но INPC широко распространён, прост в использование, легко адаптируем - поэтому часто, особенно в простых случаях, используют его и в Модели. Прочитайте темы из Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп], в том числе "INPC и получение данных из Модели"
1
|
||
|
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
|
|||
| 28.08.2019, 13:30 | |||
|
1
|
|||
|
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 47
|
|
| 28.08.2019, 13:36 [ТС] | |
|
novikov.ea, в моём случае изменяются свойства модели, поэтому мне необходимо уведомлять об этом ViewModel, чтобы в дальнейшем обновить View. Кроме как реализовывать INotifyPropertyChanged в Model, других лучших способов я не знаю, если вы знаете, напишите, пожалуйста, если можно с примерами.
0
|
|
|
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
|
|
| 28.08.2019, 13:45 | |
|
Model имеет какую-либо логику? Или ваши объекты ViewModel просто полностью дублируются объектами Model? Что делает приложение?
0
|
|
|
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 47
|
|
| 28.08.2019, 13:49 [ТС] | |
|
novikov.ea, в Model у меня имеется метод в классе, который в цикле производит итерацию над одним из свойством этого класса, и мне нужно, чтобы во View при итерации данного свойства происходила итерация значения ProgressBar.
0
|
|
|
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
|
|||||||
| 28.08.2019, 14:13 | |||||||
|
Пример кода.
1
|
|||||||
|
Модератор
|
|||
| 28.08.2019, 14:26 | |||
Сообщение было отмечено Sirius1989 как решение
Решение"Часто" - в учебных примерах. По началу когда осваивал WPF+MVVM смотрел разные примеры, видеоуроки практически всегда в Model использовался INPC. Это связано с тем, что в таких локальных приложениях передача данных от Model происходит в типах которые потом напрямую отображаются в View и, соответственно, в этих типах обязательно реализуется INPC. НО так как в типах данных Модели есть реализация INPC, то логично и в самой Модели делать такую реализацию. В приложениях же где нет прямой передачи данных в оригинальных типах (это практически все крупные и нелокальные приложения), там, конечно, использование INPC хоть и возможно, но другие механизмы оказываются более эффективными. Что же касается INPC не даёт чёткого контракта взаимодействия с моделью с точки зрения оповещения ViewModel о наступлении любых событий, то INPC легко адаптировать. Делается производный класс от PropertyChangedDataEventArgs добавляются в него свойства и получаем возможность передачи дополнительной информации. В разделе есть тема где я в примере использую подобное.Добавлено через 2 минуты
1
|
|||
|
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
|
|||
| 28.08.2019, 14:36 | |||
|
0
|
|||
|
Модератор
|
||
| 28.08.2019, 15:27 | ||
|
Где-то в разделе есть тема с обсуждением этого. Допустим, есть клиент-серверное приложение: какой-то сервер отправляет ответы на запросы. Запросы и ответы в JSON. Наша задача создать клиента. В клиенте мы выделяем Модель для работы с сервером и отправки/получения сообщений. После парсинга JSON получаем типы которые отправляем по цепочке Model->VM->View. В этих типах нужна реализация INPC. И Модель Клиента - это Локальная Модель, которая, по сути, является частью VM. Сама же Model - это сервер, так как вся бизнес логика находится там. Но в простых локальных приложениях, особенно в созданных с учебной целью, кроме этой локальной Модели и нет другой. Так же как и в задаче от Sirius1989. Я не сколько не спорю с вами по сути. Просто в своих вопросах Sirius1989 интересуется за такую Локальную Модель, которая, как вы справедливо заметили, на самом деле и не Модель, а часть VM.
0
|
||
|
Модератор
|
||
| 28.08.2019, 15:55 | ||
|
На примере Программное заполнение коллекции и отображение в DataGrid с использованием MVVM пост #14. Модель - это class ModelMVVMTest.Тип для передачи данных - это class Person.
0
|
||
|
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
|
||||
| 28.08.2019, 16:21 | ||||
|
1) Отправка запросов на сервер и их обработка 2) Логирование 3) Работа с локальной БД (например, для кэширования) 4) Обращение к файловой системе клиентского компьютера 5) Получение системного времени клиентского компьютера Это всё логика уровня Model, но никак не ViewModel, так как данная логика не имеет никакого отношения к модели представления.
1
|
||||
|
Модератор
|
||||
| 28.08.2019, 16:43 | ||||
|
Допустим, по ответу создали new Person() {Id =1, Name="Ivan"};Теперь, приходит сообщение об изменении Name у Id=1. Если есть INPC, то мы находим Person с этим Id и меняем имя. А если нет INPC? Ответ от Storm23 в теме Классы Model в View
0
|
||||
|
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
|
||||||
| 28.08.2019, 17:04 | ||||||
|
С сервера приходит сообщение об изменении Name у Id=1. Класс уровня Model, обрабатывает это и инициирует событие, например, PersonChanged с информацией Id=1. ViewModel, подписавшись на это событие, получает уведомление о его наступлении и изменяет данные для отображения. Никакой INPC для того, чтобы это реализовать, не потребовался. локальная модель это тоже самое что ViewModel. Если думать о том, что локальная модель - это ViewModel, то это может привести к нарушению уровней абстракции. Классы, не содержащие логику для подготовки данных для отображения не являются ViewModel. Примеры такой логики я привёл выше.
2
|
||||||
|
Заблокирован
|
|
| 28.08.2019, 21:43 | |
|
novikov.ea,
спасибо за ваши сообщения в данной теме и раз уж такая пьянка, то вопрос и предложение: 1. По каким материалам лучше всего изучить практические современные варианты реализации паттерна MVVM? Не хочется проходить весь исторический путь - ранее было одно, сейчас несколько иное и т.д. P.S.1. И ещё, выходит, что "для примеров", как пишут тут, используется одно, а реально потом нужно будет использовать другое. Вот такой подход, на мой непросвещенный в MVVM взгляд, глубочайшая методологическая ошибка. 2. novikov.ea, хорошо бы, чтобы Вы открыли новую тему и четко дали там один или несколько (для характерных случаев) вариантов практической реализации паттерна MVVM. Тогда их можно было бы использовать как рабочие шаблоны. Меньше было бы вопросов по теме и это дало бы Вам в реальную карму много плюсов))) P.S.2. Было бы классно, если бы примеры кода Вы сопроводили кратким описанием используемых средств и механизмов и пояснением, почему так, а не эдак. Добавлено через 26 минут ПыСы. Бу-га-га , прям в тему: Паттерн mvvm
0
|
|
|
Модератор
|
||
| 29.08.2019, 00:03 | ||
|
Я пишу, что для простых, маленьких приложений часто удобно использовать. Его можно легко адаптировать под конкретное применение. Он прост и широко известен. Я не сколько не спорю с тем, что для крупных приложений его не имеет смысла использовать. Речь идёт только о маленьких (в основном учебных) решениях. По указанной выше ссылке ProgressBar в MVVM можно создать кучу кастомны событий в Модели. Но смысл какой? Просто для того что бы это было не INPC? INPC в указанной задачи прекрасно справляется и ни какого смысла в создании кастомных событий я не вижу. Так же и в большинстве подобных задач. Если INPC справляется и им удобно пользоваться, то зачем создавать кастомные события?
1
|
||
|
Модератор
|
||
| 29.08.2019, 00:23 | ||
|
Если делать с полной абстракцией уровней в MVVM, то Модель должна получить данные, распарсить их максимум в дефолтные типы (string, int. double и т.п.) и послать сообщение в VM о том, что появились некие данные. VM получает их и по ним создаёт/изменяет типы предназначенные для View в которых, естественно, есть INPC. Но какой смысл в таком полном разделении? Если Модель может сразу распарсить данные в нужные для View типы? Чем мешает наличие INPC у типов в которые Модель будет парсить данные? А если Модель парсит данные в типы пригодные для View то что это: Model или часть VM? Я не думаю, что надо отстаивать до фанатизма идею абсолютной чистоты MVVM, тем более что критериев этой чистоты нет и спорить об этом можно до бесконечности. Да - есть паттерн, есть понимание его реализации, есть какие-то определённые критерии которые желательно соблюдать. Допустим, для Модели и View это независимость друг от друга. В Локальной Модели создаются типы используемые напрямую в View. Поэтому полностью независимыми Модель и View назвать нельзя. И в таком случае Модель частично выполняет функции VM. Но означает ли, что так строго запрещено делать? Если это удобно, прозрачно, читаемо - то почему бы так не сделать? Только из-за боязни нарушить кристальную чистоту MVVM?
1
|
||
|
Заблокирован
|
||
| 29.08.2019, 10:55 | ||
|
Наверное, аналогично можно "оправдать" любое отступление от того или иного паттерна. Такое ощущение, что этого лучше не делать. Почему? Да по тем именно причинам, по которым эти паттерны и были предложены. Паттерн, в частности - это ж экономия мышления, ограничитель неуемного творчества и локальной квазиоптимизации. Я сделал в формате "для сэбэ" достаточно объемное (но простое в программистском смысле) приложение инженерное, в котором изначально стал нарушать все паттерны и все принципы ООП))) К концу работы уже стал стараться соответствовать хоть чему-то. Опыт!))) А если буду что-то новое лепить, то постараюсь насколько смогу соответствовать принципам и паттернам) Оно того стоит.
0
|
||
|
Модератор
|
||||
| 29.08.2019, 11:31 | ||||
|
Какой смысл в использовании кастомного события вместо INPC? Приложение здесь Программное заполнение коллекции и отображение в DataGrid с использованием MVVM Какой смысл парсить (десериализовывать) данные в типы без INPC и потом в ViewModel их преобразовывать в типы с INPC? Чем мешает Модели INPC в Person? Где хоть в одном источнике написано, что парсинг данных в Модели в типы пригодные для View нарушает MVVM? К Модели по сути одно требование - работа с данными не зависимо от используемой View. Посмотрите в Программное заполнение коллекции и отображение в DataGrid с использованием MVVM - там с Моделью работает консолька. Можно использовать и WPF и WF и что другое в голову взбредёт. Так что никакого нарушения MVVM в такой реализации нет. Добавлено через 10 минут Выше я уже объяснял, что нет критериев "кристальной чистоты" MVVM. Это дополнительные критерии создаваемые уже различными сообществами программистов или отдельными программистами. И эти критерии могут различаться. Что для одного является "кристально чистым" MVVM для другого может таким не являться. Поэтому, в начале обучения, я вижу смысл в ориентировании на базовые принципы MVVM, а они предлагают довольно широкую трактовку и различные реализации. Другое дело, что когда будет работа в каком-то коллективе над каким-то общим проектом, то там появятся дополнительные корпоративные требования, в том числе по реализации MVVM. Допустим, создавать в Prism, MVVMLight и др. НО это ДОПОЛНИТЕЛЬНЫЕ требования. И в реальной работе их тоже надо исполнять. Но я пишу у БАЗОВЫХ принципах MVVM
0
|
||||
|
Заблокирован
|
||
| 29.08.2019, 11:52 | ||
|
Но везде пишут, что данные в View попадают из ViewModel. Поэтому с точки зрения своей некомпетентности, в данном случае я бы дублировал эти типы модели в ViewModel. Локально это не оптимально. Но глобально такой подход может быть правильным. Я не знаю. Пусть гуру выскажутся. Это же удобно в конце концов - когда все типы данных, которые отображаются в View, определяются в ViewModel. А в модели полно и других типов.
0
|
||
| 29.08.2019, 11:52 | |
|
Помогаю со студенческими работами здесь
20
INotifyPropertyChanged не работает
Реализация INotifyPropertyChanged Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|