|
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 20
|
|||||||||||||||||||||
UWP MVVM Привязка событий к кнопке21.09.2021, 14:17. Показов 4432. Ответов 36
Начал изучать uwp и mvvm. Создал приложение, добавил кнопу на View и связал ее с методом Button_click в viewModel
Объявление Button во view
0
|
|||||||||||||||||||||
| 21.09.2021, 14:17 | |
|
Ответы с готовыми решениями:
36
Привязка в MVVM MVVM паттерн и привязка данных MVVM и DataTable. Привязка к данным |
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 22.11.2022, 13:51 | ||
|
Модель - это именно описание бизнес-процессов, т.е. каких-то данных, их допустимых состояний и допустимых действий над ними в разных состояниях. Добавлено через 2 минуты И из этого всего следует, что правильно реализованный слой модели приложения, может быть легко переиспользован в любом окружении вообще без каких-либо модификаций модели, т.е. одну и ту же модель (dotnet-сборку) можно использовать: 1. В консольном приложении, которое хранит данные модели в JSON-файлах. 2. В WPF-приложении, которое хранит данные в базе данных. 3. В WEB-приложении, которое хранит данные модели где-нибудь в облаке.
1
|
||
|
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
|
||
| 22.11.2022, 13:53 | ||
|
В Вашем примере экземпляр VM получает объект модели в контруктор, а кто этот объект модели создает и передает при создании экземпляра VM?
0
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
|||||||
| 22.11.2022, 13:58 | |||||||
|
Если экземпляр VM создаётся для тестирования, то там все зависимости можно и вручную создать, или же заглушки для них. Но для это нужно зависимости абстрагировать через интерфейс:
0
|
|||||||
|
Модератор
|
||||||||||||||||||
| 22.11.2022, 14:10 | ||||||||||||||||||
|
Vanka03, и вот Окна:
Модель реализована совместно с VM в одном классе PersonsModelViewModel.Добавлено через 1 минуту Разбито на папки по именам пользователей для кого создаются примеры. Добавлено через 2 минуты Как видите - диалог ввода данных создаётся чисто в View. А добавление по этим данным нового пользователя выполняет уже команда VM. В каждом новом диалоге автоматически в XAML создаётся новый Person для ввода данных. Если он не будет добавлен, то просто улетит в мусор. Если будет - то в коллекцию Людей и автоматически будет отображён в основном Окне.
0
|
||||||||||||||||||
|
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
|
|||
| 22.11.2022, 14:20 | |||
|
Получется, что данные для отображения хранит VM, а не модель? Ведь коллекция People - свойство VM? Добавлено через 1 минуту Добавлено через 6 минут Получается, что модель - это коллекция Person, а команда уже относится к VM? Или тут так сходу не разделить?
0
|
|||
|
Модератор
|
||||
| 22.11.2022, 14:28 | ||||
|
При раздельной реализации в Модели будет метод или команда для добавления. И событие если был добавлен, удалён, изменён Person. VM вызывает метод Модели. Передаёт ему данные. Модель обрабатывает данные, добавляет Person в свою логику. Если удачно, то метод возвращает true и VM закрывает диалог. НО! VM добавляет в свою коллекцию Person только по событию Модели, а не в результате работы метода. Добавлено через 2 минуты Для разделения нужно сначала решить когда должен быть закрыт диалог добавления. Метод добавления в Модели, в общем случае, может выполняться очень долго. Например, будет запрос на какой-то Web сервер. Как быть с диалогом? Передать параметры и сразу закрыть? Или заморозить в ожидании результата выполнения метода? Добавлено через 3 минуты В реальных ("взрослых") приложениях используются внедрения зависимостей, сервисы и прочее.
0
|
||||
|
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
|
||||
| 22.11.2022, 14:53 | ||||
|
Добавлено через 24 минуты
0
|
||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||||
| 22.11.2022, 14:54 | |||||||||||||
|
Vanka03, ViewModel -- отображает состояние Model.
Model -- єто какой-то сервис, которьій вообще не зависит от WPF. Он может использоваться как в консольном проекте, так и в любом другом. View "слушает" ViewModel с помощью реализации INotifyPropertyChanged интерфейса, а именно через собьітие PropertyChanged. ViewModel -- єто слой MVVM паттерна, главной целью которого является оповещение View об изменениях в Model. А теперь логический вопрос: а откуда ViewModel знает об каких-то изменениях в Model? Не будете же Вьі запускаскать бесконечньій цикл, которьій будет постоянно проверять: а не изменилась ли коллекция в Model слое?! -- нет, Вьі просто подпишитесь на собьітие изменения и будете его поднимать тогда, когда коллекция в моделе изменилась: Уровен Model
Проще! Но внимательно читайте вот єтот вот участок реплики:
Єто лишь архитектурньій подход, чтобьі у Вас View и Model бьіли независимьіми и Model ни про какие ObservableCollection'ьі не знала в принципе, так как єто ее не касается.
2
|
|||||||||||||
|
Модератор
|
|||
| 22.11.2022, 14:56 | |||
|
Person - это DTO для обмена данными. В Модели будут свои внутренние Бизнес Сущности, которые отражаются (в том числе) с помощью Person. Пример слишком просто для объяснения. Усложним немного. Есть некая Игра. У игры есть данные которые нужно сохранять между сеансами. Этим занимается Репозиторий. Репозиторий это тоже часть БЛ и Модели. Но из-за частого использования, о нём часто говорят как об отдельном слое лежащим ниже Модели. В репозитории для работы с Хранилищем используются какие-то сущности. Например UnityEntity. И эти сущности инкапсулированы в Репозитории поскольку зависимы от Хранилища. Но только сохранения для логики Игры мало. Сущности в ней взаимодействую друг с другом, в них есть своя логика. Поэтому здесь появляется UnityDomain. Обмен данных с Репозиторием в Модели может происходить по разным сценариям. Предпочитаемая реализация это "Дружественный Репозиторий". В этом случае в Репозиторий поступают UnityDomain. Если это "Недружественный" репозиторий, то для обмена с ним вводятся ещё UnityDto. Далее. Модель должна ещё как-то общаться с потребителями данных. Отдавать UnityDomain она им не может, так как потребители это всегда "недружественные" объекты. Например, игрок хочет сжульничать и через связанную сущность может повилять на БЛ игры. Здесь тоже используются DTO. Могут быть те же, что с репозиторием, но могут быть и иные, так как возможно в них нужна интеграция от других сущностей. В том числе это могут быть и "маленькие модельки", которые позволяют с собой безопасно работать. В результате получим или UnityModel или UnityModelDto. Следующий уровень ViewModel. Здесь может понадобиться другая функциональность. Например для мутабельной типа нужна реализация INPC. Или нужны какие-то ключи локализации, флаг выбора юнита и т.п. Соответственно на этом уровне получаем UnityViewModel. Приходим на уровень View. А здесь нам понадобились привязки, триггера, шаблоны данных и прочее. И создаём UnityControl. Итого получаем цепочку типов: Entity, Dto, Domain, ModelDto, ViewModel, Control. Это, конечно, сценарий "для страшного сна", но для примера максимальной абстракции, думаю, пойдёт. Добавлено через 1 минуту А вот в VM она должна быть обязательно. Как без этого View сможет её отобразить?
1
|
|||
|
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
|
||||
| 22.11.2022, 15:11 | ||||
|
Почему-то я думал, что бизнес-логика должна быть в VM, но теперь с этим покончено, впереди Новая Прекрасная Жизнь (я надеюсь). Это не означает, что я все понял, и вопросы закончены, но их качество должно повыситься) Добавлено через 2 минуты Добавлено через 43 секунды
0
|
||||
|
Модератор
|
||
| 22.11.2022, 15:24 | ||
|
Но подумайте сколько лишних телодвижений придётся для этого сделать. Person в Модели как-то связан с БЛ. Например, рассчитывается сколько им еды нужно или фонд зарплаты. Они могу порождать какие-то другие объекты. Результаты труда например. А вы взяли просто "лёгким движением" добавили (родили) или удалили (убили) Person в коллекции и Модель даже не узнала об этом. По факту есть два сценария для БЛ: 1) Коллекция в Модели инкапсулирована (или её вовсе нет). Добавление удаление объектов происходит только через методы Модели, в которые являются частью БЛ. При изменениях коллекции Модель сообщает об этом через своё событие - это, как минимум, нужно чтобы у разных потребителей (VM) были одни и те же данные. 2) Коллекция публичная. Чтобы следить за её состоянием и состоянием сущностей в ней в Модели нужна подписка не только на изменение коллекции, но и на изменении каждой сущности коллекции. При этом для сущностей нужна ещё автоматическая отписка на случай удаления из коллекции. Эта прослушка будет вызвать нужные методы Модели для внесения согласованных изменений в БЛ. Что проще реализовать? Думаю первое. Второе тоже используется, но гораздо реже, в достаточно сложных решениях. Где в коллекции не просто DTO-шки, а Модельки. Когда таких коллекций много и можно сделать одну обобщённую реализацию и использовать её для разных типов.
0
|
||
|
|
||
| 22.11.2022, 15:25 | ||
|
1
|
||
|
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
|
||
| 22.11.2022, 16:30 | ||
|
0
|
||
|
Модератор
|
||
| 22.11.2022, 17:31 | ||
|
Замените на new RelayCommand<T> из указанной вами ссылки.Добавлено через 5 минут Там же по ссылке есть пример как создавать команду.
0
|
||
|
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
|
||
| 22.11.2022, 17:44 | ||
|
Я немного поразмыслил, хочу еще позадавать вопросы: У меня есть БД, где есть Дивизионы, Команды и Игроки. DbContext у меня будет играть роль модели. На главном окне (Окно1) у меня будет TreeView, где будет информация об них. У Окна1 есть VM, которая занимается отображением содержимого DbContext на TreeView. Также на Окне1 есть кнопка "Создать Дивизион". По нажатию на нее открывается окно создания дивизиона (Окно2). На Окне2 текстовые поля для данных и кнопка "Ок". На Ок я собрался прибиндить команду. Но команда должна формировать объект и отправлять его в DbContext, о котором VM Окна2 пока ничего не знает. Могу ли я, например, создать синглтон для DbContext и обращаться к нему из VM Окна2? Как-то надо же его передать.
0
|
||
|
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
|
||||||||||||||||||||||||||||
| 22.11.2022, 20:02 | ||||||||||||||||||||||||||||
|
А если бы была? Нужно было бы создавать Модель-прослойку, некоторые методы которой отвечали бы за взаимодействие с DbContext? Добавлено через 2 часа 0 минут VM Окна2:
Есть вопросы: 1. У Вас в примере идет привязка текстбоксов к ресурсам, т.е., насколько я понял, при изменении значений в текстбоксах ресурсы не меняются, т.е. в коллекцию People всегда попадает Петя Сидоров? Я решил отказаться от ресурсов вообще, забиндил свои текствоксы к свойствам VM и создаю объект через них. Подскажите, чем мне грозит такой подход? 2. Т.к. я не использую ресурсы решил не использовать обобщенный AutoCommand. Пытался написать так:
3. При попытке использовать ресурсы в строке
Error XDG0010 Object of type 'System.Windows.Markup.Reference' cannot be converted to type 'Companies.VMs.IClose'. Вроде имя вверху разметки добавил это, что пошло не так?
0
|
||||||||||||||||||||||||||||
| 22.11.2022, 20:02 | |
|
MVVM и обработчик событий Привязка курса валют к TextBox по MVVM
MVVM зум объекта, привязка события к кнопке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
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 и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|