|
Модератор
|
||||||||||||||||||||||||||||||||||||
WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]18.01.2019, 19:56. Показов 57924. Ответов 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 [Элд Хасп]
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|