879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
|
||||||||||||||||
1 | ||||||||||||||||
CanExecute команды и привязка через Interaction25.02.2020, 18:35. Показов 1412. Ответов 16
Метки нет (Все метки)
есть команда, которая устанавливает в переменную какое-то значение
0
|
25.02.2020, 18:35 | |
Ответы с готовыми решениями:
16
Привязка команды к менюшке Привязка команды к элементам TreeView Привязка команды во View к другой ViewModel Привязка команды к кнопке внутри ListBox WPF |
1838 / 1346 / 427
Регистрация: 10.06.2011
Сообщений: 2,126
|
|
25.02.2020, 18:56 | 2 |
0
|
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
|
||||||
25.02.2020, 19:48 [ТС] | 3 | |||||
novikov.ea,
проблема в том, что у меня есть некая дефолтная команда, которая должна вызываться в любом случае после этой команды,т.е.
Добавлено через 3 минуты ну и еще если вешать команду на какое-то другое событие
0
|
Модератор
|
|
25.02.2020, 19:52 | 4 |
Для события Click - это не имеет смысла.
Для другого же события, откуда элемент (в частности кнопка) может знать, что своё свойство IsEnabled он должен привязать к CanExecute команды выполняющейся по неизвестно какому событию? Надо же элементу это как-то "объяснить". Самый простой способ - простая привязка к свойству опращивающему CanExecute команды. Но при изменении состоянии команды, надо кидать, соответсвующий, PropertyChanged. Если задача частая для вас, то можно расширить функционал типа реализующего ICommand добавив в него такое свойство и интерфейс INPC. Внутри типа, по событию CanExecuteChanged, кидать сразу и PropertyChanged. Добавлено через 2 минуты Если команда DefaultCommand "знает" о команде TestCommand , то в своём CanExecute она может проверять CanExecute команды TestCommand.
1
|
1838 / 1346 / 427
Регистрация: 10.06.2011
Сообщений: 2,126
|
|
25.02.2020, 21:35 | 5 |
Я думаю, что не стоит описывать привязки команд таким способом. Почему бы не сделать одну команду и просто привязывать её к кнопке? А в коде ViewModel задать правило для CanExecute? Я думаю, что это было бы проще.
Это конкретный случай в вашей программе? Или просто задумка "на будущее". Если второе, то не следует заниматься оверинжинирингом. Если первое, то не совсем понятно, зачем кнопке дизеблиться на другие события, кроме клика?
1
|
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
|
|
26.02.2020, 11:21 [ТС] | 6 |
скажем так, иногда можно подцепить команду на событие previewMouseLeftButtonDown какого-то контрола и бывают ситуации, когда этот контрол должен дизеблиться. Такое работать не будет, как я понял. И нужно решать это другими способами, а жаль.
свою проблему решил с помощью 1 команды и нормальной привязки. всем спасибо за ответы
0
|
Модератор
|
|
26.02.2020, 12:26 | 7 |
Можно заменить
<i:Interaction.Triggers> <i:EventTrigger ... на свой Behavior.В котором делать подписку команды на событие, и подписку IsEnabled элемента на CanExecuteChanged команды.
1
|
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
|
|
26.02.2020, 14:16 [ТС] | 8 |
как вариант можно и так, но все-таки красивее таки создать отдельное свойство и привязать его к IsEnabled. Я просто думал есть какое-нибудь стандартное решение без изобретения велосипедов
0
|
Модератор
|
||||||
26.02.2020, 14:55 | 9 | |||||
Нет - стандартного не будет.
Это, как уже написал novikov.ea, очень не типично для WPF решений. Даже просто проверка по событию CanExecute не снимает всех вопросов, так как для CanExecute нужен параметр. И одна и та же команды может выполняться с разными параметрами. Можно сделать универсальный конвертер через который биндить IsEnabled к команде и параметру
0
|
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
|
||||||
26.02.2020, 15:19 [ТС] | 10 | |||||
Элд Хасп,
а если параметр в canExecute не является параметром команды? т.е.
0
|
1577 / 583 / 183
Регистрация: 05.12.2015
Сообщений: 935
|
||||||||||||||||
26.02.2020, 15:24 | 11 | |||||||||||||||
можно просто привязать сколько угодно команд через MultiBinding.
выполняться будут по очереди, в том числе и CanExecute для каждой команды
0
|
Модератор
|
|
26.02.2020, 15:33 | 12 |
Такая проверка срабатывает независимо от значения параметра.
Ведь в лямбде вы просто отбрасываете параметр y=> CanDoIt("Hallo, World") - y не испльзуется.Для такой команды можно привязать любой параметр или, вообще, не задавать его. Тогда будет передан null - прочитайте комментарии в коде.Можно добавить второй конвертер, если параметр не нужен. Такой конвертер будет проще использовать в XAML, но возникает проблема: Когда проверять привязку? Мультиконвертер проверяет при изменении привязанной команды или её параметра. Но если состояние команды зависит от данных, то WPF просто не узнает что надо обновить привязку. Вот в вашем примере когда надо вызывать y=> CanDoIt("Hallo, World") ?В WPF+FW, в реализации Новая реализация RelayCommand с исправлениями от proa33 и kolorotur [WPF, Элд Хасп], состояние команды проверяется при любых изменениях в окне. Это происходит очень часто. Попробуйте поставить в отладке в методе точку останова. Вы даже выйти из отладчика не сможете. Вызовы будут следовать один за другим. В Core уже такая реализация RelayCommand работатьне будет. Там надо явно вызывать метод Invalidate(). В общем, "чем дальше в лес...". Нужные подробности реализации, чтобы понять какой функционал должен быть для конкретной реализации.
0
|
1838 / 1346 / 427
Регистрация: 10.06.2011
Сообщений: 2,126
|
|
26.02.2020, 15:35 | 13 |
proa33, есть упущение: данный MultiCommand не отслеживает CanExecuteChanged у декорируемых команд. Следует подправить реализацию.
Но вообще, чем проще - тем лучше. Проще и очевиднее иметь одну команду на каждое событие.
0
|
1577 / 583 / 183
Регистрация: 05.12.2015
Сообщений: 935
|
|
26.02.2020, 15:40 | 14 |
novikov.ea, понятно, что это базовая, минимальная реализация.
тут главное, что все под контролем - вызовы методов и параметры.
0
|
Модератор
|
||||||
26.02.2020, 15:44 | 15 | |||||
hamin, вот вариант конвертера который можно использовать и как мультиконвертер, и как простой конвертер без передачи команды.
Да, так и есть. Но не пришло в голову общего решения, для универсального конвертера. Это же надо подписываться на все команды, а конвертер не знает на какую команду он уже подписался. И куда потом кидать PropertyChanged? Как определять, что можно уже отписаться от конкретного экземпляра команды. Целая куча вопросов. При использовании Behavior это всё разрешимо.
0
|
1577 / 583 / 183
Регистрация: 05.12.2015
Сообщений: 935
|
|
26.02.2020, 15:56 | 16 |
но есть простой способ прверки - работает данная реализация в КОНКРЕТНОМ случае для КОНКРЕТНОЙ задачи или нет?
если все устраивает и работает, то зачем эта "куча вопросов", решение который окажется бесполезным?
0
|
Модератор
|
|
26.02.2020, 16:05 | 17 |
Вариант для проверки уже дали и вы, и я.
Пусть hamin, проверит, если оно ему нужно. А вопросы, возникли из-за моего размышления о общей реализации "на все случаи жизни".
0
|
26.02.2020, 16:05 | |
26.02.2020, 16:05 | |
Помогаю со студенческими работами здесь
17
Привязка команды для элемента контекстное меню TreeView Спам CanExecute в RelayCommand CanExecute или как обновить команду Creating ActionScripted Animation and Interaction Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |