Domanda

Ho una ListBox che ha uno stile definito per ListBoxItems.All'interno di questo stile, ho un certo numero di etichette e di un pulsante.Un pulsante, voglio definire un evento che può essere gestito sulla mia pagina (o tutte le pagine che utilizzano quello stile).Come faccio a creare un gestore di eventi sul mio WPF pagina per gestire l'evento, dal mio ListBoxItems stile?

Qui è il mio stile (codice interessato solo):

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

Grazie!

È stato utile?

Soluzione

Guarda RoutedCommands.

Definire il vostro comando in classe da qualche parte come segue:

    public static readonly RoutedCommand Login = new RoutedCommand();

Ora definire il pulsante con questo comando:

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

È possibile utilizzare CommandParameter per ulteriori informazioni..

Ora, ultimo ma non meno importante, iniziare ad ascoltare il comando:

Nel costruttore della classe che si desidera fare qualche bella roba, ti posto:

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

o in XAML:

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

E si implementa il delegato del CommandBinding esigenze:

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

Si può iniziare ad ascoltare questo comando ovunque in visual tree!

Spero che questo aiuta

PS Si può anche definire il CommandBinding con un CanExecute delegato che sarà anche disattivare il comando se CanExecute dice così :)

PPS Ecco un altro esempio: RoutedCommands in WPF

Altri suggerimenti

Come Arcturus inviato, RoutedCommands sono un ottimo modo per raggiungere questo obiettivo.Tuttavia, se c'è solo un pulsante nel vostro DataTemplate quindi questo potrebbe essere un po ' più semplice:

Si può effettivamente gestire qualsiasi evento Click del pulsante dall'host ListBox, come questo:

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

I pulsanti contenuti all'interno della ListBox fuoco che evento quando vengono cliccati su.Dall'interno del gestore di eventi è possibile utilizzare la posta.OriginalSource per ottenere un riferimento al pulsante che è stato cliccato.

Ovviamente questo è troppo semplicistico se il tuo ListBoxItems avere più di un pulsante, ma in molti casi funziona bene.

Si potrebbe creare un controllo utente (.ascx) a casa, la listbox.Quindi aggiungere un evento pubblico per la pagina.

Public Event btnRemove()

Poi su evento click del pulsante in usercontrol

RaiseEvent btnRemove()

È inoltre possibile passare oggetti attraverso l'evento, proprio come qualsiasi altro metodo.Questo permetterà il controllo utente per raccontare la tua pagina che si desidera eliminare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top