|
Модератор
|
||||||||||||||||||||||||||||||||||||
WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]18.01.2019, 19:56. Показов 58026. Ответов 92
Тема из цикла Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
Для использования и создания WPF команд в Net предусмотрен интерфейс IСommand и классы RoutedCommand и RoutedUICommand. Команда - это View компонента и ей присущи чисто View-ские свойства: можно привязать её, параметр передаваемый ей, целевой элемент; она может всплывать по дереву элементов; можно обработать её по по пути всплытия. Основная проблема применения команд в MVVM, на мой взгляд, это отсутствие встроенной поддержки привязки к методам ViewModel. Дефолтно в Net обработка команд производится аналогично обработке событий элементов в CB окна. И уже в в этом обработчике можно вызвать методы ViewModel. Но тут возникает другая проблема. Как обработчику получить ViewModel? Придётся обращаться к DataContext приводить к нужному типу, походу могут возникнуть ещё другие нюансы. Самым удобным было бы привязка команд в XAML напрямую, сразу к свойствам ViewModel. Для такой привязки в большинстве случаев создают дополнительный класс реализующий интерфейс IСommand. Почти всегда его называют RelayCommand. Реализации его могут быть разные, но они очень похожи. Одна из реализаций из темы Пример реализации WPF+MVVM приложения (с учётом замечания от Lexeq)
VievModel
И окно для PlusMinusViewModel
Изменим немного ViewModel для демонстрации обработки CommandParameter.
Окно для MultiOperatorsViewModel
Изменим ViewModel так чтобы нельзя было делить на ноль.
Использование WPF команд в MVVM для простых случаев, надеюсь, объяснил подробно и понятно. Но есть более сложные применения. Допустим, есть ListBox и в нём в шаблоне Item есть кнопка. Как к ней привязать WPF команду? Для этого надо вспомнить, что WPF команда это View компонента и одним и свойств WPF команды является её всплывание по дереву. Команду надо "поймать" во включающем ListBox контейнере и обработать. Как это сделать напишу в следующей части. Архив проекта с кодами приложен. Ещё хороший пример простой для понимания предложил Lexeq в пост #10 В пост #15 финальный вариант с учётом замечаний от HF, Lexeq, Рядовой, kolorotur. Там же архив со всеми кодами из темы. В пост #64 вариант реализации RelayCommand с исправленным (при помощи proa33 и kolorotur) методом Invalidate для работы в многопоточном приложении.
12
|
||||||||||||||||||||||||||||||||||||
| 18.01.2019, 19:56 | |
|
Ответы с готовыми решениями:
92
WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп] Библиотека элементов для реализации WPF MVVM Решений [WPF, Элд Хасп] Обсуждение темы "Библиотека элементов для реализации WPF MVVM Решений" [WPF, Элд Хасп] |
|
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
|
|
| 27.01.2019, 12:02 | |
|
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||||||||
| 27.01.2019, 13:21 | ||||||||||||
|
MainViewModel
MainWindow.xaml
Реализацию RelayCommand взял из постов выше.
1
|
||||||||||||
|
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
|
||||||
| 27.01.2019, 14:00 | ||||||
|
kolorotur, а что изменится, если я обычному RelayCommand отправлю асинхронную задачу?
Добавлено через 58 секунд Ваша обертка просто констатирует выполняется/завершилась ли задача и имеет возможность ее отменить?
0
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 27.01.2019, 14:17 | |
|
0
|
|
|
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
|
|
| 27.01.2019, 14:25 | |
|
Элд Хасп, ну можно еще написать класс для проброса аргументов событий во вью модель, объединить это в библиотеку и сделать плагин для Visual Studio MVVMCyberForumEdit ))
0
|
|
|
|
||
| 27.01.2019, 21:57 | ||
|
Хотел посмотреть весь проект внимательно, но в архиве не нашёл изменений с CalcModel. Есть последняя полная версия?
0
|
||
|
Модератор
|
||
| 27.01.2019, 23:01 [ТС] | ||
|
Попробую заменить. Добавлено через 8 минут Проверьте. Вроде заменил. В пост #15 - архив "WpfCommands v2.zip". Добавлено через 23 минуты kolorotur, такие теоретические рассуждения.... Команда, по сути, это View компонента. И меня смущает, что её приходится создавать в VM. На мой взгляд, более верным, более отвечающим концепции MVVM было бы создание команды в XAML и привязка к ней в XAML методов VM. Как Вы думаете? Может стоит заняться доведением классов команд до такого применения?
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 28.01.2019, 01:27 | ||
![]() Думаю, что абстрагирование через ICommand — вполне приемлимо. Если надо запустить какой-то функционал во вью-модели, то сойдет RelayCommand, а если надо реализовать что-то ну уж очень тесно связанное с представлением, то можно сделаль отдельный класс, реализующий ICommand, и присваивать на него ссылку в VM. А если воротит даже от мысли о том, что в VM создается экземпляр на что-то, работающее с View, то DI и IoC в помощь! В конце-концов, если не использовать ICommand, то придется придумывать какую-то новую абстракцию для связи вьюхи и VM, что так или иначе приведет к созданию своей версии ICommand с блэкджеком и делегатами.
0
|
||
|
Модератор
|
||
| 28.01.2019, 13:07 [ТС] | ||
|
Если объявлять команду в XAML, то всех этих ухищрений не нужно. Объявил команду, присвоил ей имя или ключ и можно привязываться к ней в XAML. Как это реализовать, честно говоря, даже не задумывался. Одно то, что привязывать в команде надо будет не свойства, а методы уже вызывает сомнения в реализуемости. Но сама мысль о какой-то незавершённости механизма команд так и гложет!
0
|
||
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
||||||||||||||||
| 28.01.2019, 14:33 | ||||||||||||||||
|
Вариант который я использовал:
Команды можно объявлять статическими и затем пользовать в XAML и коде через Intellisens Надо только добавить к классу RelayCommand метод add для добавления обработчиков
0
|
||||||||||||||||
|
Модератор
|
||||||||||||
| 28.01.2019, 15:23 [ТС] | ||||||||||||
|
Я же имел ввиду несколько иное. Что-то в таком духе:
0
|
||||||||||||
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
|||||||||||||||||
| 28.01.2019, 16:30 | |||||||||||||||||
|
По сути: Binding возможен, если объект привязки DependencyObject. Тогда RelayCommand должна наследовать этот объект.
в x:Reference надо указать объект содержащий метод:
0
|
|||||||||||||||||
|
Модератор
|
||||
| 28.01.2019, 16:47 [ТС] | ||||
|
0
|
||||
|
Модератор
|
|
| 11.02.2019, 15:16 [ТС] | |
|
kolorotur, хотел поинтересоваться об обновлении состояния команды.
Элементы в окне обновились, но кнопка с команда остаётся не активной. Если кликнуть в окне в любом месте, то команда обновляется и кнопка становится активной. Как это исправить? Привязки для элементов обновляются в другом потоке. Пытался принудительно вызывать метод Invalidate, но выдаёт ошибку из-за разных потоков.
0
|
|
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
|
| 11.02.2019, 16:20 | |
|
0
|
|
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
|
| 11.02.2019, 16:44 | |
|
в этой теме там где 23 ответа
https://stackoverflow.com/ques... ndbindings
0
|
|
|
Модератор
|
||
| 11.02.2019, 17:56 [ТС] | ||
|
Но меня, в данном случае, интересовало как как правильно воспользоваться методом Invalidate в реализации kolorotur класса RelayCommand. В принципе, он для этого и создавался. Но есть проблемы, которые я сам не знаю как решить. С потоками только начинаю осваиваться, и пока ещё не всё доходит.
0
|
||
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
|
| 11.02.2019, 18:13 | |
|
0
|
|
| 11.02.2019, 18:13 | |
|
Создание приложения "Штатное Расписание" в паттерне MVVM [WPF, Элд Хасп] WPF конвертеры [Элд Хасп] WPF vs WinForms (для начинающих) [Элд Хасп] Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml,
в чате форсили функторы модулей как суперфичу.
Пытаясь отдуплить концепт, наткнулся на тутор с простым примером.
А главный принцип обучения от. . .
|
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
|
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|