Pregunta

Tengo un ListBox que tiene un estilo definido para ListBoxItems.Dentro de este estilo tengo algunas etiquetas y un botón.En ese botón, quiero definir un evento de clic que pueda manejarse en mi página (o cualquier página que use ese estilo).¿Cómo creo un controlador de eventos en mi página WPF para manejar el evento desde mi estilo ListBoxItems?

Aquí está mi estilo (solo código afectado):

<Style x:Key="UsersTimeOffList"  TargetType="{x:Type ListBoxItem}">
... 
<Grid>
<Button x:Name="btnRemove" Content="Remove" Margin="0,10,40,0" Click="btnRemove_Click" />
</Grid>
</Style>

¡Gracias!

¿Fue útil?

Solución

Echa un vistazo a Comando enrutados.

Defina su comando en myclass en algún lugar de la siguiente manera:

    public static readonly RoutedCommand Login = new RoutedCommand();

Ahora define tu botón con este comando:

    <Button Command="{x:Static myclass.Login}"  />  

Puede utilizar CommandParameter para obtener información adicional.

Ahora, por último, pero no menos importante, empieza a escuchar tu comando:

En el constructor de la clase en la que deseas hacer algunas cosas interesantes, colocas:

    CommandBindings.Add(new CommandBinding(myclass.Login, ExecuteLogin));

o en XAML:

   <UserControl.CommandBindings>
        <CommandBinding Command="{x:Static myclass.Login}" Executed="ExecuteLogin" />
   </UserControl.CommandBindings>

E implementas el delegado que CommandBinding necesita:

    private void ExecuteLogin(object sender, ExecutedRoutedEventArgs e)
    {
          //Your code goes here... e has your parameter!
    }

¡Puedes comenzar a escuchar este comando en todas partes de tu árbol visual!

Espero que esto ayude

PD: También puedes definir CommandBinding con un delegado de CanExecute que incluso deshabilitará tu comando si CanExecute lo dice :)

PPS Aquí hay otro ejemplo: Comandos enrutados en WPF

Otros consejos

Como publicó Arcturus, los RoutedCommands son una excelente manera de lograrlo.Sin embargo, si solo hay un botón en su DataTemplate, entonces esto podría ser un poco más simple:

De hecho, puedes manejar el evento Click de cualquier botón desde el ListBox del host, así:

<ListBox Button.Click="removeButtonClick" ... />

Cualquier botón contenido dentro del ListBox activará ese evento cuando se haga clic en él.Desde el controlador de eventos, puede usar e.OriginalSource para obtener una referencia al botón en el que se hizo clic.

Obviamente, esto es demasiado simplista si sus ListBoxItems tienen más de un botón, pero en muchos casos funciona bien.

Podría crear un control de usuario (.ascx) para albergar el cuadro de lista.Luego agregue un evento público para la página.

Public Event btnRemove()

Luego, en el evento de clic del botón en el control de usuario

RaiseEvent btnRemove()

También puedes pasar objetos a través del evento como cualquier otro método.Esto permitirá que su control de usuario le indique a su página qué eliminar.

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