У меня есть свойство , в Menu
котором каждый элемент MenuItem
иерархии имеет Command
значение, определенное RoutedCommand
мной. Связанный CommandBinding
обеспечивает обратный вызов, для оценки CanExecute
которого контролируется включенное состояние каждого из них MenuItem
.
Это почти работает. Пункты меню изначально имеют правильные включенные и выключенные состояния. Однако когда данные, которые CanExecute
использует мой обратный вызов, изменяются, мне нужна команда для повторного запроса результата моего обратного вызова, чтобы это новое состояние было отражено в пользовательском интерфейсе.
Там , кажется , не будет каких - либо общедоступные методы RoutedCommand
или CommandBinding
для этого.
Обратите внимание, что обратный вызов используется снова, когда я нажимаю или вводю в элемент управления (я предполагаю, что он запускается при вводе, потому что наведение мыши не вызывает обновления).
источник
Для тех, кто столкнется с этим позже; Если вы используете MVVM и Prism,
DelegateCommand
реализация PrismICommand
предоставляет.RaiseCanExecuteChanged()
способ для этого.источник
RaiseCanExecuteChanged()
простые вызовыCommandManager.InvalidateRequerySuggested()
.((RelayCommand)MyCommand).RaiseCanExecuteChanged();
работал у меня, используя GalaSoft.MvvmLight.Command - НО после перехода наCommandWPF
он работал без необходимости что-либо вызывать. Спасибо @ fuchs777Я не мог использовать,
CommandManager.InvalidateRequerySuggested();
потому что у меня падала производительность.Я использовал команду делегирования MVVM Helper , которая выглядит, как показано ниже (я немного изменил ее для нашего требования). тебе нужно звонить
command.RaiseCanExecuteChanged()
с ВМисточник
Если у вас есть собственный класс, который реализует,
ICommand
вы можете потерять много автоматических обновлений статуса, вынуждая вас полагаться на ручное обновление больше, чем необходимо. Также может сломатьсяInvalidateRequerySuggested()
. Проблема в том, что простаяICommand
реализация не может связать новую команду сCommandManager
.Решение - использовать следующее:
Таким образом, подписчики присоединяются к
CommandManager
вашему классу, а не к вашему, и могут правильно участвовать в изменении статуса команды.источник
Я реализовал решение для обработки зависимости свойств от команд, здесь ссылка https://stackoverflow.com/a/30394333/1716620
благодаря этому у вас будет такая команда:
источник
Вот что у меня сработало: поместите CanExecute перед командой в XAML.
источник