|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||
WPF Как внедрить модель во viewModel?26.12.2024, 11:19. Показов 27492. Ответов 295
День добрый. Есть у меня метод в проекте, который вызывается из конструктора. Метод по типу "Получить все из бд и вывести на экран".
Смущает меня то, как именно я это делаю. Когда происходит загрузка, UI блокируется. Да и в целом все очень медленно и дальше будет только хуже с добавлением данных. Теперь код.
0
|
||||||
| 26.12.2024, 11:19 | |
|
Ответы с готовыми решениями:
295
Как зарегистрировать ViewModel через Autofac, создав между ViewModel и нужным View DataContext связь?
|
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||||
| 27.12.2024, 16:31 [ТС] | ||||||||
Добавлено через 1 минуту Скажите, а как можно из конструктора awaitить метод, если конструктор нельзя сделать async?
0
|
||||||||
|
|
|||
| 27.12.2024, 16:36 | |||
|
0
|
|||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
|||||||||
| 27.12.2024, 16:54 [ТС] | |||||||||
|
Видишь кнопочку "Удалить"? Под ней есть поле ввода, я туда дату ввожу. Когда нажимаю на кнопку, происходит следующее.
2) Departure - тоже свойство, к которому идет привязка из View. Тот самый TexBox с датой под кнопкой "Удалить". 2) bird.IsAlive = false; Меняем одно из свойств Entity. 3) await birdRepository.UpdateAsync(bird); Сохраняем в бд эту обновленную Entity. 4) navigationService.NavigateTo(App.Service Provider!.GetRequiredService<BirdsViewMo del>()); Обновляем UI с новыми данными.
0
|
|||||||||
|
Модератор
|
||
| 27.12.2024, 16:58 | ||
|
Функция конструктора, по большому счёту, получить в памяти место для экземпляра и предоставить ссылку на него. Код инициализация памяти (полей) выполняется между двумя этими действиями. Как сюда "всунуть" асинхронность и для чего? Если это запуск какой-то асинхронной службы, то для этого async не нужен. Если же нужен результат выполнения, то надо для этого создать метод, а не конструктора вызывать. Метод же вызывать из какого-то синхронного события.
0
|
||
|
|
|||||||||||||||||
| 27.12.2024, 16:59 | |||||||||||||||||
0
|
|||||||||||||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||
| 27.12.2024, 17:05 [ТС] | ||
|
0
|
||
|
Модератор
|
|||
| 27.12.2024, 17:05 | |||
DeleteBird(Bird bird).Команду уровня коллекции. Передача элемента в праметр CommandParameter="{Binding}".Обновление состояния Модели должно отслеживать через события Модели. В данном случае через Наблюдаемую Коллекцию отражающую локальный кеш Модели.
0
|
|||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||||
| 27.12.2024, 17:13 [ТС] | ||||||||
|
Могу ли я тут задать пару вопросов не по самой теме, но также из wpf mvvm? Или лучше также новую создать, там, думаю, без пивка тоже не обойдется. Добавлено через 4 минуты
0
|
||||||||
|
Модератор
|
||||||||||||||||||||||
| 27.12.2024, 17:16 | ||||||||||||||||||||||
|
Чтобы дальше код продолжал работать, надо же предоставить ссылку на экземпляр. А для этого нужно завершить конструктор. Вместо этого:
0
|
||||||||||||||||||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||
| 27.12.2024, 17:16 [ТС] | ||
|
Можно ли сделать это все так, чтобы я видел как элементы добавляются в реальном времени? То есть они добавляются, я могу там тыкнуть чего-нибудь, перенести окно, свернуть и тд.
0
|
||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||
| 27.12.2024, 17:24 [ТС] | ||
|
А если я хочу вызывать этот метод только когда ViewModel создана? То есть вот тут есть две команды, первая команда по умолчанию вызывается, когда приложение запускается. Те две команды привязаны к первым двум кнопкам (на кнопку Import не смотрим, ее нет). Соответственно, когда я нажимаю на Birds, происходит загрузка ViewModel, соответственно мне нужен такой же метод OnSturtup, только для обычной ViewModel.
0
|
||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||
| 27.12.2024, 17:25 [ТС] | ||||||
|
Код
0
|
||||||
|
Модератор
|
||||
| 27.12.2024, 17:31 | ||||
|
Но чтобы его использовать нужен постоянный контекст БД на весь сеанс приложения. Добавлено через 1 минуту Но обычно все слои, связи между ними, их инициализация и пр. - производzтся в App, а не в Окнах. Добавлено через 3 минуты Если создание, то надо предоставить ссылку на экземпляр ViewModel. Кому предоставить? А у же после этого загружать данные в неё. "нажимаю" - это тоже событие. И в него нет проблем вставить выполнение асинхронного метода.
0
|
||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||
| 27.12.2024, 18:00 [ТС] | ||||
|
Конструктор вызывается при создании класса. Мне как раз таки нужно, чтобы при создании класса был вызван метод асинхронный с загрузкой данных из бд без блока интерфейса. Вы подсказали про OnStatrup из класса App, это да, но у меня эта модель не сразу создается при запуске приложения, а только по нажатию кнопки в самом приложении. Добавлено через 1 минуту Можно было бы взять событие ViewModel_Loaded и там такое проворачивать, но это секция CodeBehind, а у нас тут mvvm.
0
|
||||
|
Модератор
|
||||
| 27.12.2024, 18:33 | ||||
|
INPC (INotifyPropertyChanged) и получение данных из Модели [WPF, Элд Хасп] Загрузка - это часть инициализации. В общем случае, важно понимание что нужно для работы дальнейшему коду. Если ему нужна только ссылка на экземпляр, и его состоянием позволяет сделать отложенную загрузку (для View - это почти всегда так), то в конструкторе размещается только "быстрый" код. Если требуется долгая инициализация, то она выводится из конструктора в отдельный метод, который вызывается асинхронно тем или иным способом. В случае WPF для нормальной работы механизма извещения об исключениях, необходимо вызывать весь код из синхронного в UI потоке. Проще всего это сделать в событиях. События позволяют подключать асинхронные обработчики. Поэтому наиболее частая практика, это вызов загрузки (долгой) объекта в каком-нибудь "удобном" событии. Добавлено через 4 минуты Скорее всего, вам нужно слегка поменять архитектуру данных, взаимных вызов. Как конкретно это сделать - сказать сложно, не видя вашего кода. Можете сделать упрощённый по максимуму пример демонстрирующий нужный вам функционал. Чтобы это было Решение и без загрузки данных из БД, но с какой-то достаточной инициализацией исходных данных. Загрузите его на GitHub, дайте ссылку. На таком примере будет гораздо проще показать как лучше сделать.
0
|
||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||
| 28.12.2024, 07:41 [ТС] | ||||||
|
От лишней BirdViewModel я избавился. Теперь я беру поля у Entity и вывожу их, но вот проблема.
В самом низу есть кнопка и TextBox, кнопка привязана к команде, окей. Но TextBox я могу связать только со свойствами модели из коллекции Birds, а мне нужно связать его со свойством из связанной ViewModel. То есть выйти за границы коллекции. Как этого можно добиться?
0
|
||||||
|
|
|||||||
| 28.12.2024, 08:33 | |||||||
0
|
|||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||||
| 28.12.2024, 09:42 [ТС] | ||||||||
0
|
||||||||
|
Модератор
|
|||||||||||||||||||||||||||||||||||||
| 28.12.2024, 10:51 | |||||||||||||||||||||||||||||||||||||
|
Для привязок доступны источники: 1) по умолчанию - это DataContext для FrameworkElement, для Freezable (и некоторых других типов) это DataContext родительского FrameworkElement (родительский это в чьём Dependency Property или Resources объявляется); 2) Source - в этом свойстве можно прямо задать объект источник; 3) ElementName - имя элемента зарегистрированное в текущей области имён. Для XAML это x:Name;4) RelativeSource - можно как источник: себя, предка по типу, родителя шаблона и др. Явно можно задавать только один из источников. В вашем вопросе, источник по умолчанию - это элемент коллекции. Такой источник вам не подходит. Вам нужна VM установленная на уровне ItemsControl, или даже выше на уровне окна. Можно использовать два варианта (показываю для уровня окна). По контексту данных предка:
Например:
И потом на любом уровне, в любом элементе:
Добавлено через 11 минут P.S. В случае задания экземпляра VM без локатора, не получится в сеансе работы заменить экземпляр. Расширение разметки {StaticResource ....} разрешается еждиножды. Хотя почти всегда экземпляр основной VM создаётся единожды при старте приложения, ещё до старта первого окна, всё же надо помнить об этом ограничении, чтобы не напороться на него в тех редких случаях, когда требуется смена экземпляра.Добавлено через 1 минуту Есть ещё вариант с использование Синглтона. Тоже применим только в том случае, если экземпляр VM создаётся единожды конструктором без параметров.
0
|
|||||||||||||||||||||||||||||||||||||
| 28.12.2024, 10:51 | |
|
Mvvm ViewModel в ViewModel Как внедрить БД в exe на VB 6.0 Как внедрить функцию как с внедрить свой код
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|