|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||
WPF Как внедрить модель во viewModel?26.12.2024, 11:19. Показов 25445. Ответов 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 Как внедрить функцию как с внедрить свой код
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
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 реально казались вершиной жары, когда можно было весь день пропадать на. . .
|