Obtendo não-UI objetos para responder às ligações de comando WPF
Pergunta
Eu tenho uma classe ViewModel que eu quero para responder à construído em comando Atualizar whic é disparado a partir de um botão, mas não tenho certeza de como declarar a CommandTarget.
Resumidamente, meu código é como abaixo
O construtor ViewModel e CanExecute e evento executado manipuladores -
public ViewModel()
{
CommandBinding binding = new CommandBinding(NavigationCommands.Refresh, CommandHandler);
binding.CanExecute += new CanExecuteRoutedEventHandler(binding_CanExecute);
binding.Executed += new ExecutedRoutedEventHandler(binding_Executed);
CommandManager.RegisterClassCommandBinding(typeof(ViewModel), binding);
}
void binding_Executed(object sender, ExecutedRoutedEventArgs e)
{
Debug.Print("Refreshing...");
}
void binding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
A marcação é -
<Button Command="Refresh">refresh</Button>
Agora, eu tentei configurar o CommandTarget neste botão para {Binding Source={StaticResource ViewModel}}
mas eu recebo um tempo de execução dizendo Cannot convert the value in attribute 'CommandTarget' to object of type 'System.Windows.IInputElement'
.
Eu sou novo para comandos por isso é inteiramente possível que eu sou todos os tipos de errado aqui. AnyHelp seria apreciada.
Solução
RoutedCommand
s e MVVM não se misturam. RoutedCommand
s são amarradas à árvore visual e de confiar na coleção CommandBindings
do WPF. Você deve implementar suas próprias classes ICommand
que o trabalho com o padrão MVVM. Dê uma olhada na implementações do prisma para começar.
Em meus próprios projetos MVVM, eu tenho um par de implementações de comando:
-
DelegateCommand
. Chamadas fornecidas delegados para determinar se o comando pode executar, e para executar o comando. -
ActiveAwareCommand
. Trabalha em conjunto com uma interface (IActiveAware
) e envia execuções de comando para o item atualmente ativo. Múltiplas implementações conscientes ativos registar-se com o comando eo comando automaticamente rotasCanExecute
/ chamadasExecute
para o item atualmente ativo.