Eu tenho um em Menu
que cada MenuItem
hierarquia tem sua Command
propriedade definida como RoutedCommand
definida. O associado CommandBinding
fornece um retorno de chamada para a avaliação da CanExecute
qual controla o estado ativado de cada um MenuItem
.
Isso quase funciona. Os itens de menu aparecem inicialmente com os estados ativados e desativados corretos. No entanto, quando os dados que meu CanExecute
retorno de chamada usa são alterados, preciso do comando para solicitar novamente um resultado do retorno de chamada para que esse novo estado seja refletido na interface do usuário.
Não parece haver quaisquer métodos públicas sobre RoutedCommand
ou CommandBinding
para esta.
Observe que o retorno de chamada é usado novamente quando clico ou digito no controle (acho que foi acionado na entrada porque o mouse não causa a atualização).
fonte
Para quem se deparar com isso mais tarde; Se você estiver usando MVVM e Prism, a
DelegateCommand
implementação de PrismICommand
fornece um.RaiseCanExecuteChanged()
método para fazer isso.fonte
RaiseCanExecuteChanged()
apenas chamadasCommandManager.InvalidateRequerySuggested()
.((RelayCommand)MyCommand).RaiseCanExecuteChanged();
funcionou para mim, usando GalaSoft.MvvmLight.Command - MAS depois de mudar paraCommandWPF
, funcionou sem a necessidade de chamar nada. Obrigado @ fuchs777Eu não poderia usar
CommandManager.InvalidateRequerySuggested();
porque estava sendo atingido pelo desempenho.Eu usei o comando Delegating do MVVM Helper , que se parece com abaixo (eu ajustei um pouco para o nosso req). você tem que ligar
command.RaiseCanExecuteChanged()
da VMfonte
Se você tiver implementado sua própria classe que implementa,
ICommand
poderá perder muitas atualizações automáticas de status, forçando-o a confiar na atualização manual mais do que seria necessário. Também pode quebrarInvalidateRequerySuggested()
. O problema é que umaICommand
implementação simples falha ao vincular o novo comando aoCommandManager
.A solução é usar o seguinte:
Dessa forma, os assinantes se conectam à
CommandManager
classe e não à sua classe e podem participar adequadamente das alterações no status do comando.fonte
Eu implementei uma solução para lidar com a dependência de propriedade nos comandos, aqui o link https://stackoverflow.com/a/30394333/1716620
graças a isso, você terá um comando como este:
fonte
Isto é o que funcionou para mim: Coloque o CanExecute antes do comando no XAML.
fonte