У меня есть примерно такой 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 знаю, меня интересует решение без фреймворка
Если вы писали по старинке без mvvm приложения то тогда поймете. VM это почти тоже самое как xaml.cs файл раньше в которым мы писали логику интерфейса и данных. Так же и здесь, в VM уходит логика интерфейса и некоторые данные если упрощать. Логику работы с данными тут уже нужно выносить. То есть как вы и думали можно сделать список List файлов прямо во VM и забиндить на него вашу stackpanel или какой вы там элемент используете. А Model это уже Класс ваших файлов и их свойства которые вы будете дальше использовать. Получается биндим к List<Files>
.
Может термины где то я пишу не совсем правильные, но именно такую логику предоставляют гайды по mvvm. В частности тот что на хабре. То есть те элементы которые мы ходим менять во View пишем во ViewModel? а потом передаем дальше измененные данные в другие классы/методы для работы.
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 это модели) и под состоянием модели может иметься ввиду значения кучи объектов одновременно.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть две базыУдаленная PostgresSQL и моя локальная MySQL