|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||
WPF Как внедрить модель во viewModel?26.12.2024, 11:19. Показов 27498. Ответов 295
День добрый. Есть у меня метод в проекте, который вызывается из конструктора. Метод по типу "Получить все из бд и вывести на экран".
Смущает меня то, как именно я это делаю. Когда происходит загрузка, UI блокируется. Да и в целом все очень медленно и дальше будет только хуже с добавлением данных. Теперь код.
0
|
||||||
| 26.12.2024, 11:19 | |
|
Ответы с готовыми решениями:
295
Как зарегистрировать ViewModel через Autofac, создав между ViewModel и нужным View DataContext связь?
|
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
|||||
| 24.02.2025, 16:20 [ТС] | |||||
|
Добавлено через 31 минуту Добавлено через 4 минуты ViewModel в ресурсах UserControl она создается новая? Если да, тогда понятно в чем дело.
0
|
|||||
|
|
|||||||||||||||||
| 24.02.2025, 16:59 | |||||||||||||||||
Vissmuy, Вот ресурсы окна из примера
Vissmuy, Или вот такое ещё. От свойства VM управляем элементами UI
0
|
|||||||||||||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
|||
| 24.02.2025, 17:53 [ТС] | |||
|
https://github.com/Londongrad/Flashcards-3.0 Вот проект, над которым я сейчас пыхчу. В главной модели отметил основные задачи на текущий момент. Добавлено через 1 минуту Почему тогда через них не делать все, что угодно?
0
|
|||
|
|
|||
| 24.02.2025, 17:58 | |||
|
Добавлено через 17 секунд
0
|
|||
|
Модератор
|
|||||||
| 24.02.2025, 22:12 | |||||||
0
|
|||||||
|
Модератор
|
||
| 24.02.2025, 22:16 | ||
|
С большой вероятностью, раз это взаимодействие между двум разными View и их ViewModel, это взаимодействие более высокого уровня. Так же имеет значение функционал этого действия. Это может быть как функционал VM (то есть отражаемый в Модели), тогда это реализуется на уровне Основной VM. Или View - тогда это реализуется на уровне Окна или App.
0
|
||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
|||
| 25.02.2025, 08:50 [ТС] | |||
|
Добавлено через 3 часа 43 минуты
0
|
|||
|
Модератор
|
||||||||
| 25.02.2025, 09:48 | ||||||||
|
Если какой-то дочерний экземпляр VM нужен для постоянного доступа, то кроме предоставления его через Навигатор Current, можно его предоставить и через дополнительное свойство MainVM. То есть:
0
|
||||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
|||
| 25.02.2025, 11:02 [ТС] | |||
|
0
|
|||
|
Модератор
|
|||||||||||||
| 25.02.2025, 12:17 | |||||||||||||
{Binding BirdsVM.Свойство, Source={StaticResource mainVM}}
Так как в таких классах значения меняются только из Биндинга, то достаточно простых автосвойств. Если потребуется изменять значения из Шарпа, то нужна уже полная реализация свойств как для VM.
0
|
|||||||||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||
| 26.02.2025, 12:20 [ТС] | ||
|
Элд Хасп,
Элд Хасп, также хотел спросить, вот имею я доступ к CurrentItem из CollectionView. Но могу ли я взять номер этот айтема? Имею ввиду, на каком по счету я сейчас элементе в коллекции
0
|
||
|
Модератор
|
||||||||
| 26.02.2025, 12:42 | ||||||||
|
VM отражает Модель. В "абсолюте": - Эта кнопка изменяет состояние Модели? - Скорее всего, нет. - А раз состояние Модели не меняется, то причём здесь ViewModel? Конечно, на практике, часто нарушают границы разделения слоёв. Но это уже частный осознанный выбор. И надо понимать какие преимущества даёт такое нарушение. Если преимуществ нет, то зачем нарушать? Индекс можно получить в представлении этой коллекции. Я вам показывал вариант с Hidden ListBox. Добавлено через 3 минуты Файл BirdsWpfSln/BirdsWPF/Views/UserControls/ListBirdView.xaml в комите efb2018
0
|
||||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||
| 27.02.2025, 05:06 [ТС] | ||
|
И в чем разница между Content="{Binding SelectedItem}, как в комите и Content="{Binding CurrentItem} как сейчас?Добавлено через 10 минут Хочу сделать некую валидацию для поля, необходимо проверять - есть ли запись с уникальным свойством в бд, и если есть, то необходимо повлиять на некоторые элементы View, например поменять Visibility одного элемента и отключить кнопку для сохранения записи в бд. Как лучше это сделать? Раньше я в сеттере свойства для поля, куда ввожу данные, через if вызывал метод для проверки и менял bool переменную, от которой зависело Visibility свойство.Возможно по совету Andrey-MSK я мог бы в кодовой части представления через DataContext ViewModel получить состояние булевой переменной и оттуда менять свойство UI элемента, но куда и как расположить метод или команду по самой валидации поля, куда я ввожу данные?Хотя опять же вы(Элд Хасп) говорили, что лучше bool свойство для CheckBox вынести в отдельный класс-хелпер, как тогда иметь к нему доступ?
0
|
||
|
Модератор
|
||||||||
| 27.02.2025, 12:21 | ||||||||
SelectedItem - это свойство Selector (от него происходят ListBox, ListViw, DataGrid). У Selector есть свойство SelectedIndex, которое и даёт нужный вам индекс по CollectionView, которую можно получить в свойстве Items. В данном случает она же получается и из ItemsSource, но в общем случае это не всегда так.А CurrentItem - это свойство CollectionView. А в CollectionView нет индексации.Если надо просто отключать кнопку, то проще всего добавить проверку в метод CanExecute команды. Если нужна универсальная проверка, которую можно использовать "где угодно", то на вскидку приходят в голову два варианта: 1) Реализация интерфейса INotifyDataErrorInfo, и потом использование ошибки валидации для включения-выключения нужных элементов; 2) Добавление дополнительных свойств сообщающих о корректности нужных свойств. Что-то по типу:
0
|
||||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||||||||||||
| 27.02.2025, 17:12 [ТС] | ||||||||||||||||
|
Элд Хасп, такс, получилось следующее:
Во View, где мне собственно и надо было выводить все это я в ресурсах определяю CollectionViewSource, так как мне по сути эта коллекция только тут и нужна. По крайней мере пока что.
TextBlock вывожу данные.
0
|
||||||||||||||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
|||
| 27.02.2025, 17:23 [ТС] | |||
|
0
|
|||
|
Модератор
|
|||||
| 27.02.2025, 23:05 | |||||
|
С этим ничего не поделаешь. Если нужно с единицы, то надо использовать конвертер инкримента. Или общее-арифмитический. Пример такого конвертера: ExpressionConverter Различные варианты реализации: 1) Производный интерфейс с дополнительным членом; 2) Дополнительный интерфейс для валидации, в том числе INotifyDataErrorInfo; 3) Отдельная модель валидации; 4) Общий интерфейс "на все случаи жизни", но в котором не всегда все члены реализуются. Не реализованное свойство это не обязательно выкидывание исключение при обращении к члену. Это может быть и реализация по умолчанию. Например, в командах в которые передаются только метод Execute, используют для CanExecute метод всегда возвращающий true. Когда столкнётесь с его ограничения, там уже будете разбирать другие варианты. Добавлено через 4 минуты CollectionViewSource x:Key="words", то нет нужды в использовании экземпляра CollectionViewSource.ListBox.Items тоже предоставляет экземпляр CollectionView. Все настройки по фильтрации, сортировке и группировке можно производить и с Items.В моём примере экземпляр CollectionViewSource использовался для того чтобы доступ к нему был из разных страниц View.
0
|
|||||
|
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
|
||||||||||||||||
| 19.03.2025, 07:01 [ТС] | ||||||||||||||||
|
Элд Хасп, сейчас сессия, диплом и прочее. Поэтому немного тормознул, хотя все еще интересно освоить wpf.
Поглядывая в перерывах увидел тут в ветке twoentity в репе метод по возвращению данных, который включает в себя проекцию. Для чего здесь проецирование данных? Если убрать - работает также, по крайней мере мне так кажется. У вас так.
Все не дает покоя этот saferep. Взять за пример этот метод по добавлению. В целом в плане одноразового контекста все понятно, разве что только не понимаю зачем у одноразового контекста очищать отслеживание. Это как то что-то экономит или оптимизирует?Но вот дальше вызывается событие. Пытался проследить логику его вызова. Но что-то никак. Объясните пожалуйста эту цепочку.
Элд Хасп, правильно ли я понял, что в методе Add сохранение в бд уже прошло до вызова события, а после у нас просто из-за этого события происходит добавление сущности в локальный кеш? Потому как в самом методе я не замечаю прежних действий по синхронизации коллекций из одноразового и постоянного контекстов.
0
|
||||||||||||||||
|
Модератор
|
|||||
| 19.03.2025, 08:49 | |||||
|
Объяснение в чём безопасность. Результат метода GetAllAsync - это ссылочный тип. Потребитель его получил и может делиться этим объектом с другими потребителями. Но так как это будет один и тот же объект, то любой из потребителей, если внесёт изменение в этот объект, то это изменение коснётся всех остальных потребителей тоже. Следовательно, возвращаемый объект либо должен уведомлять своих потребителей об собственном изменении, либо быть иммутабельным.Результат .ToList().Select(b => b) является иммутабельным.А результат (IEnumerable<TId>)....ToList() можно кастом привести к IList или к List<TId> и изменить. Встраивать в ответ метода объект, уведомляющий о собственных изменениях (например, ObservableCollection), на мой взгляд избыточно.context была добавлена сущность idDto из параметров метода.Мы её "скинули" в БД. Но в общем случае, в БД может быть своя логика, которая может несколько по другому записать значения idDto: что переформатировать , добавить/удалить и т.п. Например изменить регистр текста в каком-то поле или добавить актуальный штамп времени.При этом нет гарантии, что изменения в БД будут и в сущности, которая в данный момент храниться в context. Поэтому мы очищаем context, заново читаем из БД сущность в него idDto = set.Find(idDto.Id) и дальше используем уже эту новую сущность гарантированно правильно отражающую запись БД.Второй аспект - это обновление View (в общем случае любого потребителя репозитория). Например сущность idDto предоставляется через свойство для привязки. У нас нет в требованиях, что сущность типа TId должна обязательно уведомлять о собственных изменениях. Следовательно изменение сущности не повлечёт уведомление привязкам о необходимости обновиться. Поэтому нам в свойстве надо заменить один экземпляр TId на другой. Вот этот другой, новый экземпляр метод и вернёт после после сброса контекста и нового чтения из БД.Подымается событие и в его параметре передаётся новый TId idDto.Дальше потребитель репозитория, который прослушивает событие RepChanged может обновиться.Почему не достаточно возврата return idDto;?Потому что потребителей может быть несколько. Один из них вызвал метод AddAsync(TId idDto), получил его результат и может актуализировать своё состояние.А другие потребители этого же экземпляра репозитория не узнают об этом и их состояние будет неактуальным. В нём локальный кеш (если он нужен) создаётся уже на уровне потребителей репозитория.
0
|
|||||
|
Модератор
|
|||||
| 19.03.2025, 08:49 | |||||
|
Объяснение в чём безопасность. Результат метода GetAllAsync - это ссылочный тип. Потребитель его получил и может делиться этим объектом с другими потребителями. Но так как это будет один и тот же объект, то любой из потребителей, если внесёт изменение в этот объект, то это изменение коснётся всех остальных потребителей тоже. Следовательно, возвращаемый объект либо должен уведомлять своих потребителей об собственном изменении, либо быть иммутабельным.Результат .ToList().Select(b => b) является иммутабельным.А результат (IEnumerable<TId>)....ToList() можно кастом привести к IList или к List<TId> и изменить. Встраивать в ответ метода объект, уведомляющий о собственных изменениях (например, ObservableCollection), на мой взгляд избыточно.context была добавлена сущность idDto из параметров метода.Мы её "скинули" в БД. Но в общем случае, в БД может быть своя логика, которая может несколько по другому записать значения idDto: что переформатировать , добавить/удалить и т.п. Например, задать актуальный Id, изменить регистр текста в каком-то поле или добавить актуальный штамп времени.При этом нет гарантии, что изменения в БД будут и в сущности, которая в данный момент храниться в context. Поэтому мы очищаем context, заново читаем из БД сущность в него idDto = set.Find(idDto.Id) и дальше используем уже эту новую сущность гарантированно правильно отражающую запись БД.Второй аспект - это обновление View (в общем случае любого потребителя репозитория). Например сущность idDto предоставляется через свойство для привязки. У нас нет в требованиях, что сущность типа TId должна обязательно уведомлять о собственных изменениях. Следовательно изменение сущности не повлечёт уведомление привязкам о необходимости обновиться. Поэтому нам в свойстве надо заменить один экземпляр TId на другой. Вот этот другой, новый экземпляр метод и вернёт после после сброса контекста и нового чтения из БД.Подымается событие и в его параметре передаётся новый TId idDto.Дальше потребитель репозитория, который прослушивает событие RepChanged может обновиться.Почему не достаточно возврата return idDto;?Потому что потребителей может быть несколько. Один из них вызвал метод AddAsync(TId idDto), получил его результат и может актуализировать своё состояние.А другие потребители этого же экземпляра репозитория не узнают об этом и их состояние будет неактуальным. В нём локальный кеш (если он нужен) создаётся уже на уровне потребителей репозитория.
0
|
|||||
| 19.03.2025, 08:49 | |
|
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 и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|