Obtención de objetos que no son de la interfaz de usuario para responder a los enlaces de comandos de WPF
Pregunta
Tengo una clase de ViewModel que quiero responder al comando Refresh incorporado que se activa desde un botón pero no estoy seguro de cómo declarar el CommandTarget.
En pocas palabras, mi código es el siguiente
El constructor de ViewModel y los controladores de eventos CanExecute y Executed -
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;
}
El marcado es -
<Button Command="Refresh">refresh</Button>
Ahora, he intentado configurar el CommandTarget en este botón para {Binding Source = {StaticResource ViewModel}}
pero obtengo un runtime que dice No se puede convertir el valor en el atributo 'CommandTarget' para objetar del tipo 'System.Windows.IInputElement'
.
Soy nuevo en los comandos, por lo que es completamente posible que estoy completamente equivocado aquí. Cualquier ayuda sería apreciada.
Solución
RoutedCommand
s y MVVM no se mezclan. Los RoutedCommand
están vinculados al árbol visual y dependen de la colección CommandBindings
de WPF. Debe implementar sus propias clases de ICommand
que funcionan con el patrón MVVM. Echa un vistazo a implementaciones de Prism para empezar.
En mis propios proyectos de MVVM, tengo un par de implementaciones de comandos:
-
DelegateCommand
. Llama a los delegados proporcionados para determinar si el comando puede ejecutarse y para ejecutar el comando. -
ActiveAwareCommand
. Funciona junto con una interfaz (IActiveAware
) y envía ejecuciones de comandos al elemento activo actualmente. Múltiples implementaciones activas se registran con el comando, y el comando enruta automáticamente las llamadasCanExecute
/Execute
al elemento activo actualmente.