|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||
WPF Как внедрить модель во viewModel?26.12.2024, 11:19. Показов 25448. Ответов 295
День добрый. Есть у меня метод в проекте, который вызывается из конструктора. Метод по типу "Получить все из бд и вывести на экран".
Смущает меня то, как именно я это делаю. Когда происходит загрузка, UI блокируется. Да и в целом все очень медленно и дальше будет только хуже с добавлением данных. Теперь код.
0
|
||||||
| 26.12.2024, 11:19 | |
|
Ответы с готовыми решениями:
295
Как зарегистрировать ViewModel через Autofac, создав между ViewModel и нужным View DataContext связь?
|
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
|||||||
| 29.12.2024, 12:19 [ТС] | |||||||
|
Я изначально RelayCommand и ObservableObject также взял из интернета и сильно не вникал в них, тут наверное нужно сделать также. С самими командами, правда, не понятно, как их писать.
DeleteBirdCommand.RaiseCanExecuteChanged (); Что значит обновление? Зачем обновлять? В каком месте тут нужно производить сохранение изменений в бд?
0
|
|||||||
|
Модератор
|
|||||
| 29.12.2024, 12:31 | |||||
bird => bird.IsAlive.Так как мы меняем bird.IsAlive = false;, то надо известить о том, что требуется заново проверить состояние команды.Иногда такое обновление срабатывает автоматически, но для вложенных свойств и асинхронных методов, часто автоматически не срабатывает. И нужно "вручную" уведомлять. await Task.Delay(2000); .Добавлено через 1 минуту Если делать "качественно", то требуется влезать глубже.
0
|
|||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||
| 29.12.2024, 12:41 [ТС] | ||
|
Для SQLite репозиторий, как я понял, нужно будет вернуть. Добавлено через 4 минуты Плюс чтобы учиться и запоминать - нужно последовательно приходить к таким решениям. Я изначально вообще sql-команды вручную писал и не знал ни про DI, ни про асинхронность.
0
|
||
|
Модератор
|
|
| 29.12.2024, 13:10 | |
|
Vissmuy, Я сейчас чуток занят. Поэтому отвечать буду по мере возможности.
Репозиторий, чтобы двигаться дальше, нужно вернуть. Для начала SQLite. Но для больших объемов и мульти пользовательской работа она плохо подходит. Если потребуется замена на "взрослую" БД, то т это сделаем уже позже, после отладки на SQLite. Доступность знаний..... Они как бы доступны, но очень фрагментированы. И большой частью на английском. То что вам нужно восполнить пробел, это даже не WPF. Это правильная реализация архитекторы приложения. WPF просто более стран в этом отношении. Реализация в MVVM, является стандартом в WPF. Она всем понятна, легко тестируется, большинство примеров и подсказок тоже будет в ней. Поэтому, фактически, для нормального освоения WPF требуется освоение MVVM, а для него нет научиться создавать правильную архитектуру данных и приложения. Добавлено через 9 минут Есть много нюансов, которые мне сразу в голову приходят, но которые не так просто объяснить. Например, между изменением свойства и сохранением в БД, есть временной лаг. И возникает коллизия отражения: представление в этом промежутке не верно отражает состояние Модели. А если произойдет отказ в сохранении, то это уже будет откровенный баг. По простому эту коллизия не разрешить. Но она же не имеет отношения к WPF. Здесь уже возникает коллизия ваших знаний. Умей вы разрезать такие коллизии, то вопроса о них в разделе WPF даже не возникало бы. Следующая коллизия. В момент когда происходит сохранение GUI в текущей реализации не замораживается. И сущности могут меняться в GUI. Но ведь они уже переданы на сохранение и их изменение во время сохранения может вызвать ошибки. Соответственно, здесь тоже надо подумать над каким-то решением которое хоть и затрагивает WPF, но решать надо не средствами WPF.
0
|
|
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||||||||
| 29.12.2024, 15:15 [ТС] | ||||||||||||
|
Кстати, еще хотел спросить. Таким образом действительно контекст устанавливается или только для подхвата свойств удобства ради такое делается?
0
|
||||||||||||
|
Модератор
|
|||
| 29.12.2024, 16:02 | |||
d: задаёт значения времени Разработки. В Рантайм они игнорируются: mc:Ignorable="d"Добавлено через 14 минут Использует его, в данной реализации, ContentControl из MainWindow. Он получает значение из свойства "{Binding CurrentView}" от MainWindow(MainWindowViewModel viewModel). И ищет шаблон по типу. Это вложенное поведение ContentControl. MainWindowViewModel начальным значением свойства CurrentView задаёт BirdsViewModel.И здесь принципиальным становится вопрос в каком порядке, что инициализируется. В первоначальной реализации ServiceProvider должен был быть обязательно инициализирован до первого вызова MainWindowViewModel. Но не во всех сценариях так происходит. Поэтому я jбернул его в try-catch? чтобы в случае исключения уже подсовывать напрямую экземпляр ServiceProvider.В целом ваша реализация ServiceProvider вызывает много нареканий. В первую очередь по изоляции слоёв. Каждый слой App, View, ViewModel, Model - это по идее отдельная сборка. ServiceProvider реализован в слое App. Но ни один из других слоёв не имеет доступа к слою App. И, следовательно, в MainWindowViewModel не может быть вызова App.ServiceProvider.Структура WPF решения Структура связей в WPF Решении Структура WPF+БД решения Потоки в асинхронном MVVM
0
|
|||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
|||
| 29.12.2024, 16:17 [ТС] | |||
0
|
|||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||
| 30.12.2024, 03:44 [ТС] | ||||
|
И из определения нифига не понятно
Добавлено через 2 минуты Так, разобрался. Да, придется еще один раз создать эту вилку, но теперь у меня локальный репозиторий в нормальном месте, где все проекты, а не черт пойми где на другом диске. Добавлено через 1 минуту
0
|
||||
|
Модератор
|
|
| 30.12.2024, 10:31 | |
|
Vissmuy, сильно не переживайте.
Я сам не шибко GitHub знаю. Осваивайте по мере возможностей. Пригодится. По репу буду отправлять изменения не все сразу. А по шагам с существенными изменениями. Чтобы вы могли уследить за ними и понять их логику.
0
|
|
|
Модератор
|
||
| 30.12.2024, 10:39 | ||
|
Все Fork-и вы можете посмотреть в своём Репе: Fork - это вилка, клон. Делается чтобы вносить изменения не затрагивая основной Реп. Синхронизацию от основного в Fork можно делать всегда, обратные изменения из Fork в основной только через "Pull request" после принятия владельцем основного.
0
|
||
|
Модератор
|
|||
| 30.12.2024, 18:00 | |||
.git, копируете в эту папку файлы нужно проекта, открывает Студию и фиксируете изменения.Добавлено через 3 часа 36 минут Отправил запрос на изменения:
Ещё один Pull request с началом реализации Репозитория. Пока нет времени дальше продолжать.
0
|
|||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||
| 30.12.2024, 18:04 [ТС] | ||
|
0
|
||
|
Модератор
|
||
| 30.12.2024, 18:36 | ||
![]() В первом Pull request перенос проектов по папкам. Это порождает много изменений, но среди них почти нет существенных. Добавлено через 1 минуту Не подумал об этом. Следовало сначала сделать перенос. Зафиксировать. И только потом вносить изменения.
0
|
||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
|||||||||||
| 31.12.2024, 05:08 [ТС] | |||||||||||
|
День добрый. С наступающим всех. Есть проблема с StringFormat в Xaml.
Без StringFormat все норм, значение выводится только когда я свойству присваиваю значение из TextBox под кнопкой, но выводится оно в неудобном формате. Удалось пофиксить добавлением триггера TextBox'у, который просто скрывает этот TextBlock. Подскажите, такое решение грамотное?
0
|
|||||||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||
| 31.12.2024, 10:49 [ТС] | ||
|
Кстати ObservableObject из проекта BirdsCommon и BaseInpc из того же проекта в папке ViewModelBase одинаковы.Попробую сначала ознакомиться с примером реализации в вашей теме.
0
|
||
|
Модератор
|
||||||||||||||||||||||||||||
| 31.12.2024, 12:31 | ||||||||||||||||||||||||||||
|
Step1. Внедрение общей библиотеки. Взял свои реализации, которые часто использую и добавил проект для них:
Добавлено через 15 минут Отличия в реализациях свойств. Объявление свойств для вашей первичной реализации ObservableObject:
Для вашей первичной реализации ObservableObject и BaseInpc:
Первый Шаг завершается переводом всех VM на ViewModelBase.
0
|
||||||||||||||||||||||||||||
|
Модератор
|
|
| 31.12.2024, 12:56 | |
|
Step2. Внедрение Репозитория.
В данной реализации Репозиторий это вся бизнес логика, поэтому Репозиторий это и есть наша Модель. Если будет несколько репозиториев, то их совокупность будет Моделью. Для универсальности в общей библиотеке объявлен базовый класс (запись) для сущностей Репозитория в котором есть целый Id.Создан интерфейс универсального репозитория. И объявлен класс (запись) Bird. Bird несёт двоякую функцию. При получении от Репозитория - это сущность связанная и отслеживаемая Репозиторием. Менять свойства этих сущностей нельзя - это может повлечь баги в работе Репозитория. При создании Bird вне репозитория -это обычный DTO, который используется как контейнер для передачи значений. Далее для Репозитория Bird был добавлен новый проект:
0
|
|
|
Модератор
|
|
| 31.12.2024, 13:12 | |
|
Step 3. Рефакторинг Моделей Представления.
Все VM перенесены в отдельный проект. Навигатор совмещён с Основной ViewModel MainBirdsViewModel. Сервисы убраны для получения экземпляров убраны, чтобы упростить понимание связей и их создание.В MainBirdsViewModel создаются дочерние VM BirdsViewModel и AddBirdViewModel. Все команды для работы с репозиторием объявлены в MainBirdsViewModel.Не совсем понял что за список BirdNameGroups, но сделал его статическим. В экземпляре для удобства прокси свойство возвращающее этот статический список.Birds передаёт в View неизменяемый локальный кеш контекста. privateBirds уже не нужен. Надо перенести создание ReadOnlyObservableCollection в Репозиторий. Добавлена команда навигации по типу VM NavigateToType.BirdsViewModel - здесь уже никакого функционала практически не осталось. Departure содержащий дату создания экземпляра BirdsViewModel и NumberOfBirds не понял чо это такое. Больше ничего здесь нет.AddBirdViewModel - вообще, пустой класс. Используется только для переключения Представлений.Третий Шаг на этом завершается.
0
|
|
|
Модератор
|
|||||||||||||||||||||||||||||||
| 31.12.2024, 13:27 | |||||||||||||||||||||||||||||||
|
Step 4. Рефакторинг View и App.
Пока разделять View и App не стал - и так хватает сложностей понимания. Для упрощения конструирование, нужно создавать экземпляры используемые в View на XAML. Так как создание MainBirdsViewModel требует параметрического конструктора, то для упрощения создал Расширение Разметки MainBirdsViewModelExtension:
Экземпляр создаётся в ресурсах App:
MainWindow получает в Контексте Данных этот экземпляр DataContext="{DynamicResource mainVM}" и в основном использует его только для навигации:
Надо в MainBirdsViewModel добавить установление первоначального текушего значения:
BirdsView и AddBirdView получают в Контексте Данных свои VM, если нужны общие данные то обращаются в Основной VM. Пример получения команды:
BirdsView добавил источник Времени Разработки, чтобы Конструирование было нагляднее:
Если есть какие-то вопросы по конкретным фрагментам кода, логике - пишите.
0
|
|||||||||||||||||||||||||||||||
| 31.12.2024, 13:27 | |
|
Mvvm ViewModel в ViewModel Как внедрить БД в exe на VB 6.0 Как внедрить функцию как с внедрить свой код
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|