Obtención de objetos que no son de la interfaz de usuario para responder a los enlaces de comandos de WPF

StackOverflow https://stackoverflow.com/questions/606115

  •  03-07-2019
  •  | 
  •  

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.

¿Fue útil?

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 llamadas CanExecute / Execute al elemento activo actualmente.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top