C# WPF MVVM связь ViewModel - Model и ViewModel - ViewModel

231
16 января 2022, 10:20

У меня есть примерно такой View окна

он состоит из 3 регионов: File Manager, Workspace и Menu. Мне нужно сделать добавление файла с помощью кнопки Menu в File Manager, View окна добавления очень простой

TextBox Name должен проверять существует ли такой файл и Border должен ставать красным если существует. Я должен сделать это строго по MVVM и собственно говоря столкнулся с 2 вопросами:

Как я понимаю Add File View Model должна говорить Add File View существует ли файл с таким именем, т.е должна быть модель которая будет получать коллекцию имен и им'я c Add File View и проверять сходство. Здесь нужно взять имена с File Manager Model и отправить в Add File Model, как это сделать? Можно создать свойство в File Manager View Model и через Binding как параметр скормить коллекцию имен команде которая открывает окно добавления нового файла но не нарушает ли такой подход MVVM?

2 Вопрос о связи между ViewModel и Model, насколько я знаю Model может иметь свойства которые имплементуруют INotifyPropertyChanged и View может к ним делать Binding, но как на меня это превращает Model в View Model, рассматривая Model со свойствами которые не имплементуруют INotifyPropertyChanged эти свойства нужно обернуть в View Model, как Model должна уведомлять об изменении View Model?

о Prism, EventAggregator знаю, меня интересует решение без фреймворка

Answer 1

Если вы писали по старинке без mvvm приложения то тогда поймете. VM это почти тоже самое как xaml.cs файл раньше в которым мы писали логику интерфейса и данных. Так же и здесь, в VM уходит логика интерфейса и некоторые данные если упрощать. Логику работы с данными тут уже нужно выносить. То есть как вы и думали можно сделать список List файлов прямо во VM и забиндить на него вашу stackpanel или какой вы там элемент используете. А Model это уже Класс ваших файлов и их свойства которые вы будете дальше использовать. Получается биндим к List<Files>.

Может термины где то я пишу не совсем правильные, но именно такую логику предоставляют гайды по mvvm. В частности тот что на хабре. То есть те элементы которые мы ходим менять во View пишем во ViewModel? а потом передаем дальше измененные данные в другие классы/методы для работы.

Answer 2

1) В ответе на 2 вопрос я вам написал, что ViewModel должна давать представлению коллекцию объектов (ObservableCollection), которые представляют собой файл. Для вашего функционала с добавлением файла достаточно всего 1 команды, которая проверяет, есть ли в коллекции такой элемент, если есть, то устанавливает у него созданное вами свойство (булевское), которое биндится на Visibility бордера и преобразовывается из bool в Visibility. А если нет, то добавляет новую модель в ObservableCollection и она автоматически появляется в списке. Также не забудьте про метод CanExecute. Тут все очень просто, если значение в поле пустое, то нельзя добавить файл. Что касательно открытие нового окна. То здесь подход очень простой. Только View может создавать View. Код создания нового View нужно писать во вью. Можете писать декларативно, можете в CodeBehind.

2) Модель может реализовывать INotifyPropertyChanged. Скажу больше, это абсолютно нормально. Как реальный жизненный пример я вам могу привести в пример любую сущность из БД. Она с точки зрения MVVM является моделью. Вы не совсем правильно понимаете, что такое Model и ViewModel. ViewModel переводится как модель представления, т.е. это ФУНКЦИОНАЛЬНЫЕ ВОЗМОЖНОСТИ графического ИНТЕРФЕЙСА пользователя и в ней пишется код который реализует поведение интерфейса пользователя, а Model это реализация бизнес-логики (она же функциональность приложения). В вашем случае ViewModel должна возвращать коллекцию моделей (файлов) (лучше всего ObservableCollection), у которых есть свойство со значением имени, и это коллекция биндится на какой-нибудь контрол (например, ListBox с переопределенным шаблоном элемента). И на вашей картинке, которую вы привели, под состоянием модели имеется намного больше, чем простое изменение свойств. Вы не забывается, что под этими тремя квадратиками имеется ввиду 3 крупшейние части приложения (там может быть под 2к файлов, где, например, 800 файлов это View, 800 это ViewModel, а оставшиеся 400 это модели) и под состоянием модели может иметься ввиду значения кучи объектов одновременно.

READ ALSO
Периодический перенос данных из одной БД в другую

Периодический перенос данных из одной БД в другую

Есть две базыУдаленная PostgresSQL и моя локальная MySQL

88
Функция translit

Функция translit

У меня есть код:

82
Вопрос по экспорту JSON объекта в mysql

Вопрос по экспорту JSON объекта в mysql

Всем доброго дняВопрос про php mysql

93