Pregunta

Mi problema es que me gustaría manejar un comando en varios lugares. Por ejemplo tengo mi control de usuario personalizada, en un botón está obligado a algunos comandos. Tengo una orden vinculante en ese control, pero también tengo un enlace en una ventana que utiliza este control de comandos.

Mi objetivo es llevar a cabo algún tipo de acción en el interior del control mientras no interrumpir el manejo del comando en la ventana.

He intentado experimentar con eventos ejecutados y PreviewExecuted pero sin suerte. Entonces el problema simulado en una única ventana (código publica a continuación).

<Window x:Class="CommandingEvents.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CommandingEvents="clr-namespace:CommandingEvents" 
    Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
    <CommandBinding 
        Command="{x:Static CommandingEvents:Window1.Connect}"
        Executed="CommandBindingWindow_Executed"
        PreviewExecuted="CommandBindingWindow_PreviewExecuted"/>
</Window.CommandBindings>
<Grid>
    <Grid.CommandBindings>
        <CommandBinding 
        Command="{x:Static CommandingEvents:Window1.Connect}"
        Executed="CommandBindingGrid_Executed"
        PreviewExecuted="CommandBindingGrid_PreviewExecuted" />
    </Grid.CommandBindings>
    <Button Command="{x:Static CommandingEvents:Window1.Connect}" 
            CommandTarget="{Binding RelativeSource={RelativeSource Self}}"
            Content="Test" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

namespace CommandingEvents
{
    public partial class Window1
    {
        public static readonly RoutedUICommand Connect = new
            RoutedUICommand("Connect", "Connect", typeof(Window1));

        public Window1()
        {
            InitializeComponent();
        }

        private void CommandBindingWindow_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingWindow_Executed");
            e.Handled = false;
        }

        private void CommandBindingGrid_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingGrid_Executed");
            e.Handled = false;
        }

        private void CommandBindingWindow_PreviewExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingWindow_PreviewExecuted");
            e.Handled = false;
        }

        private void CommandBindingGrid_PreviewExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingGrid_PreviewExecuted");
            e.Handled = false;
        }
    }
}

Cuando pulso el botón sólo "CommandBindingWindow_PreviewExecuted" se imprime. ¿Porqué es eso? I intentado fijar e.Handled a falso, pero no hace una diferencia. ¿Puede alguien explicar este comportamiento?

¿Fue útil?

Solución

No tengo idea de por qué sucede esto (y cómo no es un error) pero aquí es lo que estaba escrito en el WPF wiki :

Hay una particularidad acerca CommandBinding que es extremadamente interesante e importante que debe saber.

El Administrador de comandos utiliza eventos enrutados para notificar a los diferentes CommandBinding objetos que ejecución de un comando era invocado (a través de gestos predeterminados, enlaces de entrada, de forma explícita, etc.).

Hasta ahora, esto es bastante sencillo. Sin embargo, lo que es más importante es que la voluntad CommandBinding marcar el evento enrutado desde el Administrador de comandos como se maneja tan pronto como manejador es ejecutado (ya sea PreviewExecuted o ejecutado).

Por último, incluso si el controlador tiene una prototipo que coincide con un delegado ExecutedRoutedEventHandler llamada, el acción ejecutada desde el CommandBinding no es sino una RoutedEvent CLR normales evento. Configuración o salir de la bandera e.Handled al cambio voluntad falsa nada.

Por lo tanto, tan pronto como un Ejecutado o manejador PreviewExecuted se invoca, la RoutedCommand pondrá fin a su enrutamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top