|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
|||||||||||||||||||||
MVVM postgres17.06.2020, 10:41. Показов 17425. Ответов 200
Метки нет (Все метки)
учу mvvm
появилось много вопросов я создал модель Кликните здесь для просмотра всего текста
создал сервис , который должен заполнять данными я это сделал так Кликните здесь для просмотра всего текста
после чего в основном классе Кликните здесь для просмотра всего текста
и тут первый вопрос. можно это сделать без циклов ? например сразу конвертировать в BindingList и как вообще правильно заполнять данными из бд? дальше я показываю таблицу в view Кликните здесь для просмотра всего текста
и снова вопрос. мне нужно добавлять данные в BindingList и при событии добавления/удаления/изменения делать изменения в бд? Или просто делать запросы в бд update/insert и после этого заново заполнять данными? второе звучит проще и логичней для меня.
0
|
|||||||||||||||||||||
| 17.06.2020, 10:41 | |
|
Ответы с готовыми решениями:
200
Mvvm
|
|
Модератор
|
|||||
| 20.03.2021, 23:53 | |||||
Сообщение было отмечено onimor как решение
РешениеТак, что отвечу хоть и частично. Сначала общей теории по MVVM. Модель - это слой содержащий Бизнес Логику. А не просто контейнер для данных. Если смотреть на ваш код, то GlavTables - это контейнер для данных или сущность данных. Но ни как не Модель. И такой мутабельный тип с INPC обычно используют только на уровне ViewModel и View. Если в приложении присутствует некий функционал по работе хранилищем (локальный файл, БД, Web и т.д.), то его принято выделять в отдельный слой - Репозиторий (Данных). Общая иерархия приложения в таком случае выглядит так: View -> ViewModel -> Model -> Репозиторий -> Хранилище. Добавлено через 4 минуты В MVVM самым удобным способом работы с БД является EF. Пусть он не настолько универсален, но он очень сильно упрощает работу с БД и делает это максимально близким к принятому в Шарпе виду. В очень редких случаях потребности превышают возможности EF и приходится использовать иные приёмы работы с БД. Добавлено через 6 минут Посмотрите выше на иерархию приложения MVVM+БД. С базой работает у вас Репозиторий. А привязку к коллекции нужно сделать в View - это на другой стороне иерархии. Никакой прямой передачи коллекции из Репозитория в View в правильно построенном MVVM не должно возникать. Вот посмотрите ещё полезные ссылки: Структура WPF решения Структура WPF+БД решения Потоки в асинхронном MVVM Добавлено через 3 минуты Если вы делаете MVVM приложение, то любые действия в UI вызывают только команды ViewModel. ViewModel собирает все необходимые данные и вызывает метод модели. Будут ли в результате этих действий изменены данные не знает ни View, ни ViewModel. Если данные изменятся, то Модель создаст событие. И по этому событию обновятся ViewModel и View.
1
|
|||||
|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
||
| 21.03.2021, 08:49 [ТС] | ||
|
Очень мельком смотрел. как я понял все переходит в работу с коллекциями вместо запросов. У меня сразу возникло 2 вопроса , возможно зная ef они могут показаться тупыми , погуглив я конечно смогу найти ответы , но раз уж мы тут . 1) добавились данные в коллекцию или изменились , ui это отобразил . вызываем метод SaveChanges() , но произошла ошибка. Что происходит ? Нужно удалять изменения ? При обычном раскладе у меня было: уехал insert запрос, после чего обновилась коллекция. 2) если в базе 1ккк записей то у меня в коллекции тоже будет 1ккк? Или там можно как-то отфильтровать по той же дате , чтоб не все забирать ? И ещё вопрос касательно MVVM . Нормальная ли практика при инициализации view и контекста данных для нее (допустим отобразить UserCotrol нужно) передавать vm основного окна в vm UC, для того чтоб использовать при необходимости методы основной vm из UC Добавлено через 8 минут Или это знак не правильной архитектуры приложения?
0
|
||
|
Модератор
|
||||
| 21.03.2021, 10:48 | ||||
|
Парочка их них: 1) Самый простой и наиболее часто используемый. Для изменения данных есть отдельные кнопки: добавить, удалить, редактировать. По нажатию на них выполняется команда VM. В команде происходит вызов метода Модели. Если в результате действия метода, будут изменения данных, в том числе удаление/добавление элементов коллекции, то Модель создаёт событие. VM ловит это событие и обновляет свои данные. Фактически реализуется два независимых канала. Один для передачи данных из Модели в View, второй для передачи действий в GUI в Модель. 2) Способ БД отражается (представляется) в DataGrid и изменения DataGrid должны сразу передаваться в БД. Если подобный интерфейс реализовывать в MVVM здесь возникает проблема "отлова" изменений в строке. Для каждой строки в VM создана своя сущность. Если в предыдущем способе сущность - это простейший контейнер практически без логики. То в этом случае, такой простой контейнер не подойдёт. Необходимо как-то синхронизировать изменения сущности с записью в БД. Можно это сделать передав Модель в каждую сущность и наделив сущность возможность самостоятельно сохранять свои Данные. Фактически сущности мы превращаем в маленькие самостоятельные VM. Можно передать в сущность делегат для команды на сохранение данных. Здесь сущность приобретает функционал вложенной (дочерней) VM. Можно в VM подписаться на события изменения и/или конца редактирования сущности и весь функционал по работе с БД останется в VM. Мне больше нравится последний подход. Добавлено через 2 минуты Но мне это не было нужно, поэтому, наверняка, сказать не могу. Но здесь надо как-то связывать виртуализацию коллекции с запросами к БД. Это отельная и большая тема. Добавлено через 5 минут Каждый UC представляет свой интерфейс, хотя и получает в Контексте Данных одby и тот же экземпляр VM. Также возможно, что вы не вполне верно разделяете функционал View и VM, и из-за этого у вас появляется неспецифическая для MVVM задача. Какие методы основной VM и для чего нужны в дочерней?
0
|
||||
|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
||||||||||||
| 21.03.2021, 11:58 [ТС] | ||||||||||||
Сделал 3 метода
При этом весь остальной контент затемняется и не доступен Так вот чтоб использовать эти методы я передаю в дочернюю VM(допустим UC настроек) текущую VM, чтобы при сохранении или проверке настроек можно было выводить уведомления использую эти методы. Еще в дальнейшем будет класс для работы с COM портом его будут использовать как минимум 3 VM если в каждой его инициализировать то будет ошибка так как com порт уже открыт и используется. Планировалось передавать уже инициализированный класс в разные VM
0
|
||||||||||||
|
Модератор
|
||
| 21.03.2021, 12:29 | ||
|
onimor, на первый взгляд, мне кажется вам надо в разные VM передавать одну и туже модель, а не ссылки друг на друга.
Допустим, вся работа с Com портов относится к уровню Модели или даже Репозитория. Зачем VM, вообще, знать что-либо о COM поре. Ей даже не нужно знать, что это СОМ порт или какой-то локальный файл. VM должна знать только Модель, её методы и события. Вызвала метод Модели получила результат метода. А как модель получила этот результат... зачем эти детали VM? Добавлено через 1 минуту Допустим, как эти методы связаны с остальными членами основной VM?
0
|
||
|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
|||
| 21.03.2021, 13:55 [ТС] | |||
|
Но ведь там будут методы для отправки и получения данных, которые будет юзать vm чтобы показать в view чтоб их использовать придется либо передать либо инициализировать этот класс в VM. все время открывать и закрывать com не вариант , они будут каждую секунду получать данные и в рандомное время отправлять. просто не будет успевать открыться и закрыться Добавлено через 17 минут
0
|
|||
|
Модератор
|
|||
| 21.03.2021, 14:04 | |||
|
Для VM Репозиторий неизвестен. VM использует методы Модели. Модель (так же как и VM, и Репозиторий) - это СЛОЙ приложения. И необязательно, что этот слой реализован в одном типе и одном экземпляре. Каждая VM получает в конструкторе Модель (один объект или несколько - неважно). Разные VM могут получать одни и те же объекты Модели. И если VM нужно обратиться к Данным, то она это делает через полученный экземпляр Модели, а не через другую VM. Добавлено через 3 минуты App - это самый верхний слой приложения и он не включается в паттерн MVVM. Этот слой лежит над всеми остальными и "знает" обо всех остальных. Посмотрите схему здесь: Реализация MVVM с несколькими разными хранилищами данных
1
|
|||
|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
|
| 21.03.2021, 14:05 [ТС] | |
|
0
|
|
|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
||
| 21.03.2021, 14:12 [ТС] | ||
|
а в случае с главным окном и диалогом.
получается есть главное окно. в нем контейнер(диалог , который вызывают 3 метода), в котором уже находится все остальное остальное. все остальное это разные UC , которым тоже нужно пользоваться этим диалогом Добавлено через 2 минуты
0
|
||
|
Модератор
|
||
| 21.03.2021, 14:19 | ||
|
Два не может быть - Гит не даёт двух одинаковых создать. Аватар такой же - задал недавно. Может второй этот тот же ник, но без аватара (аватар по умолчанию). Добавлено через 1 минуту Приглашение получил и принял.
0
|
||
|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
|
| 21.03.2021, 14:20 [ТС] | |
|
0
|
|
|
Модератор
|
|||
| 21.03.2021, 14:31 | |||
|
onimor, только открыл решение и сразу вам советую его изменить.
Вы только осваиваете MVVM и вам до конца не понятны границы в разделении функционалов слоёв. Поэтому настоятельно советую каждый слой реализовывать в отдельно проекте. Я вас дал выше ссылку на схему архитектуры. Вот в ней: каждый блок (прямоугольник) - это отдельный проект. А стрелка - это ссылка из одного проекта на другой. Единственное исключение можно сделать для App и View. Их можно реализовать в одном проекте. Но надо следить за тем чтобы в View были ссылки только на типы из библиотеки. на остальные проекты может ссылаться только App. Добавлено через 35 секунд Добавлено через 3 минуты EldHasp WpfMvvm.Это тоже мой ник, но он под отдельный проект Библиотека элементов для реализации WPF MVVM Решений [WPF, Элд Хасп]
1
|
|||
|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
|||
| 21.03.2021, 14:34 [ТС] | |||
|
0
|
|||
|
Модератор
|
||
| 21.03.2021, 14:42 | ||
|
onimor, у вас в SettingVM намешан функционал как самой VM, так и Модели и даже частично репозитрия.
Поэтому для другой VM она выступает в качестве Модели. Это, конечно, нарушение MVVM, но иногда так делается в случаях когда в таком типе полностью инкапсулирована своя независимая цепочка VM-> Model -> Репозиторий и по факту практически отсутствует Бизнес Логика. Единственно, что настоятельно советую - переходите на EF для работы с БД. Сами себе создаёте проблемы которые потом героически преодалеваете. Добавлено через 1 минуту Когда наберётесь опыта, то для простых задача будете делать однопроектные решения. Но сейчас вам надо разобраться где проходят границы слоёв, а в однопроектном Решении это очень трудно понять.
1
|
||
|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
|||
| 21.03.2021, 15:02 [ТС] | |||
|
Добавлено через 7 минут
0
|
|||
|
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
|
|||
| 21.03.2021, 15:26 [ТС] | |||
|
0
|
|||
|
Модератор
|
||
| 21.03.2021, 15:33 | ||
|
Добавлено через 39 секунд В реальном приложение это может быть несколько библиотек. Но пока всё сделайте через одну.
0
|
||
| 21.03.2021, 15:33 | |
|
Помогаю со студенческими работами здесь
20
MVVM Model в MVVM Mvvm datagrid ef WPF MVVM MVVM патерн Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|