Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
 Аватар для Sirius1989
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 47
WPF

MVVM и INotifyPropertyChanged

27.08.2019, 21:43. Показов 7486. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Начал разбираться с MVVM. И для меня непонятно в каких случаях нам нужно наследовать интерфейс INotifyPropertyChanged в model и в viewmodel, а в каких только в viewmodel?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.08.2019, 21:43
Ответы с готовыми решениями:

INotifyPropertyChanged
Подскажите пожалуйста почему это не работает: WorkCard.WorkCardFiter(_textBoxtVM); OutputListView = WorkCard.GetParsedList(); ...

INotifyPropertyChanged
Всем добрый день! Господа подскажите, пожалуйста, в каком месте приведенного ниже кода при реализации интерфейса...

Определение INotifyPropertyChanged
А где можно посмотреть само определение интерфейса INotifyPropertyChanged ? interface INotifyPropertyChanged { ... }

27
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
29.08.2019, 12:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от titan4ik Посмотреть сообщение
в данном случае я бы дублировал эти типы модели в ViewModel. Локально это не оптимально. Но глобально такой подход может быть правильным.
Я об этом тоже уже писал.
И в данном случае, как я уже неоднократно писал, речь идёт о маленьких, локальных решения создаваемы в основном для учебных целей чтобы понять как, вообще, создавать WPF+MVMM приложения. И в ракурсе этой цели (начального понимания-обучения) имеет смысл в детали реализации больших, распределённых решений?

Добавлено через 3 минуты
Подавляющему большинству начинающих трудно понять саму идею событийной связи от Model к View.
В ВУЗах как я понял события практически не изучают. Преподают программирование на уровне Фортрана 30-летней давности.
Какой смысл вместо объяснения связи Model->View объяснять что такое событие, делегаты и как их кастомно создавать?
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
29.08.2019, 16:59
Цитата Сообщение от titan4ik Посмотреть сообщение
По каким материалам лучше всего изучить практические современные варианты реализации паттерна MVVM?
Основы технологии я изучал по книге Мэтью МакДональда. На сайте Metanit также неплохо написано.
Для разработки реального приложения следует использовать фреймворк. Я использую PRISM. Почитать про него можно в официальной документации или перевод на хабре.
Также, чтобы не велосипедировать свои аналоги ViewModelBase, можно использовать ReactiveUI. Статьи на хабре про ReactiveUI: (свойства, коллекции, команды). Introduction to Rx

Цитата Сообщение от titan4ik Посмотреть сообщение
хорошо бы, чтобы Вы открыли новую тему и четко дали там один или несколько (для характерных случаев) вариантов практической реализации паттерна MVVM. Тогда их можно было бы использовать как рабочие шаблоны
Идея хорошая, подумаю над этим. На это нужно найти время.

Элд Хасп, в реализации вашего примера вы информируете ViewModel через событие PropertyChanged с PropertyName=ResultChange. При этом свойства с названием ResultChange не существует. Это нарушает контракт интерфейса, описанного в документации
Notifies clients that a property value has changed.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Получение текстовых данных (txt, JSON, XML, ini и т.д.) и их парсинг в удобные для View типы это чья функция?
Это две разные операции, и их нужно разделять:
1) Получение текстовых данных и их парсинг в объект (задача Model)
2) Преобразование и подготовка данных для отображения (задача ViewModel)

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если делать с полной абстракцией уровней в MVVM, то Модель должна получить данные, распарсить их максимум в дефолтные типы (string, int. double и т.п.) и послать сообщение в VM о том, что появились некие данные
Преобразовывать нужно в DTO (Data Transfer Object), которые повторяют структуру получаемой информации в сообщении.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но какой смысл в таком полном разделении? Если Модель может сразу распарсить данные в нужные для View типы?
Если парсить приходящие сообщения сразу во ViewModel, то можно столкнуться с проблемами, если структура сообщения будет изменена со стороны сервера. Если структура информации в сообщении поменяется, то придётся изменять структуру ViewModel (где-то плачет Single Responsibility Principle). В случае использования DTO достаточно будет поменять структуру DTO, а ViewModel просто считает данные их нового поля этого DTO.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Чем мешает наличие INPC у типов в которые Модель будет парсить данные?
Не мешает, но и не приносит пользы. Зачем DTO интерфейс INPC? DTO по определению не нужна никакая логика.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
А если Модель парсит данные в типы пригодные для View то что это: Model или часть VM?
Существуют три варианта объекта, свойства которого мы привязываем во View:
1) Объект является частью доменной модели. Это Model
2) Свойства объекта не изменяются. Но на уровне Model этот объект не используется. Тогда можно считать, что это ViewModel.
3) Свойства объекта изменяются и нужно обновлять их значения во View. Это точно ViewModel
Всё зависит от того, насколько правильно соблюдены уровни абстракции. Иначе, если объект создаётся путём парсинга сообщений, а при этом он ещё и уведомляет о своих изменениях, то он выполняет роль и DTO, и, возможно, объекта доменной модели, и ViewModel'и. (Single Responsibility Principle опять плачет)

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я не думаю, что надо отстаивать до фанатизма идею абсолютной чистоты MVVM, тем более что критериев этой чистоты нет и спорить об этом можно до бесконечности.
Только здравое обсуждение)

Кратко о написанном выше:
1) DTO+ViewModel в лице одного объекта - нарушение MVVM.
2) Реализация INPC в объектах модели не является нарушением MVVM. Но выглядит избыточным, а ваш пример нарушает контракт интерфейса.
3
 Аватар для Sirius1989
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 47
29.08.2019, 17:09  [ТС]
novikov.ea, если допустим у нас имеется MainViewModel и ContentViewModel , при этом в MainViewModel создается несколько Observable<Тип класса модели>коллекций и необходимо иметь к ней доступ с ContentViewModel. Как в этом случае лучше реализовать? Не нарушают ли принципы MVVM, если для нескольких VIEW будет одна общая ViewModel? И еще, как можно привязать каждую Observable коллекцию к определённому окну, так как каждая коллекция будет источником данных для графика, а в главном окне, есть три кнопки для открытия каждого графика соответственно?

Добавлено через 7 минут
sdsd
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
29.08.2019, 18:21
Цитата Сообщение от novikov.ea Посмотреть сообщение
Я использую PRISM
Я уже несколько раз писал я не оспариваю вас в отношении более менее крупных решений.
Но не вижу смысла такие же приёмы использовать для мелких, учебных решений.

Я сам начинающий (C# изучаю около года, WPF и того меньше) - программирование для меня хобби. И я делюсь своим личными опытом и пониманием, в том виде в каком мне кажется это будет проще понять другим начинающим.

Я не знаком с Prism и ReactiveUI, но вы же знаете их, имеете опыт использования.
Возьмите любой мой пример (лучше из моих задач в Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]) и сделайте тему (или темы) с реализацией этих же задач, но правильно с применением Prism и ReactiveUI.
Дайте свои комментарии почему так, а не этак.
Я только буду рад изучить что-то новое.

Добавлено через 5 минут
Цитата Сообщение от novikov.ea Посмотреть сообщение
PropertyName=ResultChange. При этом свойства с названием ResultChange не существует. Это нарушает контракт интерфейса,
По-моему, я там писал что делаю это для демонстрации работы INPC. Что бы не было отношения к нему как к "чёрту из табакерки". А то я часто сталкивался с тем, что объявляет интерфейс и на этом всё останавливают и появляются вопросы "Я же объявил INPC, а почему свойства не обновляются."
Возможно, такой пример разъяснения работы INPC не совсем удачен.
1
Заблокирован
01.09.2019, 17:33
Цитата Сообщение от novikov.ea Посмотреть сообщение
Основы технологии я изучал по книге Мэтью МакДональда.
Я посмотрел издание Мэтью МакДональда (WPF) от 2011 в переводе (1019 страниц) - так там ни в оглавлении, ни в предметном указателе нет MVVM вообще. Как это так?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
02.09.2019, 08:46
Цитата Сообщение от titan4ik Посмотреть сообщение
Как это так?
Потому что в книге описывается технология WPF, об использовании MVVM упоминается вскользь. Все, что там описано, можно применить и к MVVM
1
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
02.09.2019, 13:14
Цитата Сообщение от titan4ik Посмотреть сообщение
Как это так?
Не знаю. Тоже всегда было интересно, почему так.
1
Заблокирован
02.09.2019, 14:09
Цитата Сообщение от novikov.ea Посмотреть сообщение
Не знаю. Тоже всегда было интересно, почему так.

Я такой катавасии, как в мире современного программирования, нигде не встречал)))
P.S. Катавасия - (перен.) суматоха, суета, беспорядок.
Это слово, имеющее значение "беспорядок", было заимствовано из греческого, где существительное katabasion являлось церковным термином и первоначально означало "сбор двух хоров, размещенных на клиросах (а так называются возвышения по обеим сторонам алтаря для церковных певчих), в середине церкви для общего пения". Впоследствии слово было переосмыслено, видимо, в связи с тем, что при таком соединении двух хоров нередко случалась неразбериха.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2019, 14:09
Помогаю со студенческими работами здесь

INotifyPropertyChanged не работает
&lt;Window x:Class=&quot;Inotify_test1.MainWindow&quot; xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot; ...

Не работает INotifyPropertyChanged
Пишу тут программину одну простую. Собственно вот, пишу на WPF, Binding-ом привязал свойства класса. В них же идет вычисление....

Сериализация, INotifyPropertyChanged
Доброго времени суток, уважаемые сограждане, столкнулся с проблемой. У меня имеется класс, в котором реализован интерфейс,...

Интерфейс INotifyPropertyChanged
Интерфейс INotifyPropertyChanged пространства имен System.ComponentModel определяет, что наследник содержит событие PropertyChanged,...

Реализация INotifyPropertyChanged
У меня есть класс MyRectangle со свойствами зависимости (координата Х и У). И я сделал привязку: когда я выбираю этот квадрат, то в TextBox...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru