2008-08-26 19 views
7

Tengo un ListBox que tiene un estilo definido para ListBoxItems. Dentro de este estilo, tengo algunas etiquetas y un botón. Con ese botón, quiero definir un evento de clic que pueda manejarse en mi página (o en 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?WPF Estilo de cuadro de lista con un botón

Aquí es mi estilo (afectados código sólo):

<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!

Respuesta

10

Echa un vistazo a RoutedCommand s.

Definir su mando en miclase algún lugar de la siguiente manera:

public static readonly RoutedCommand Login = new RoutedCommand(); 

Ahora definir su botón con este comando:

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

Puede utilizar CommandParameter para obtener información adicional ..

Ahora última pero no menos importante, comience a escuchar su comando:

En el constructor de la clase que desea hacer algunas buenas cosas, se coloca:

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

o en XAML:

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

Y se implementa el delegado del CommandBinding necesita:

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

¡Puede comenzar a escuchar este comando en todas partes en su árbol visual!

Esperanza esto ayuda

PS También puede definir el CommandBinding con un delegado CanExecute que incluso desactivar el comando si el CanExecute lo dice :)

PPS He aquí otro ejemplo: RoutedCommands in WPF

+0

Gracias mucho Arcturus, eso es exactamente lo que estaba buscando hacer y ¡era simple! – ScottG

0

Puede crear un control de usuario (.ascx) para albergar el cuadro de lista. Luego agrega un evento público para la página.

Public Event btnRemove() 

A continuación, en el evento de clic de botón en el control de usuario

RaiseEvent btnRemove() 

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

6

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

En realidad se puede manejar de cualquier botón evento Click del cuadro de lista de host, así:

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

Cualquier botón contenidos dentro de el ListBox activará ese evento cuando se haga clic en ellos. Desde el controlador de eventos, puede usar e.OriginalSource para obtener una referencia de nuevo 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 muy bien.

Cuestiones relacionadas