Question

J'ai un ListBox dont le style est défini pour ListBoxItems.A l'intérieur de ce style, j'ai des étiquettes et un bouton.Sur ce bouton, je souhaite définir un événement de clic qui peut être géré sur ma page (ou sur toute page utilisant ce style).Comment créer un gestionnaire d'événements sur ma page WPF pour gérer l'événement à partir de mon style ListBoxItems ?

Voici mon style (code concerné uniquement) :

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

Merci!

Était-ce utile?

La solution

Jeter un coup d'œil à CommandeRoutées.

Définissez votre commande dans myclass quelque part comme suit :

    public static readonly RoutedCommand Login = new RoutedCommand();

Définissez maintenant votre bouton avec cette commande :

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

Vous pouvez utiliser CommandParameter pour des informations supplémentaires.

Enfin et surtout, commencez à écouter votre commande :

Dans le constructeur de la classe que vous souhaitez faire de belles choses, vous placez :

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

ou en XAML :

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

Et vous implémentez le délégué dont CommandBinding a besoin :

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

Vous pouvez commencer à écouter cette commande partout dans votre arborescence visuelle !

J'espère que cela t'aides

PS Vous pouvez également définir le CommandBinding avec un délégué CanExecute qui désactivera même votre commande si CanExecute le dit :)

PPS Voici un autre exemple : Commandes Routed dans WPF

Autres conseils

Comme Arcturus l'a publié, les RoutedCommands sont un excellent moyen d'y parvenir.Cependant, s'il n'y a qu'un seul bouton dans votre DataTemplate, cela pourrait être un peu plus simple :

Vous pouvez réellement gérer l'événement Click de n'importe quel bouton à partir de la ListBox hôte, comme ceci :

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

Tous les boutons contenus dans la ListBox déclencheront cet événement lorsque vous cliquerez dessus.À partir du gestionnaire d'événements, vous pouvez utiliser e.OriginalSource pour obtenir une référence au bouton sur lequel vous avez cliqué.

Évidemment, c'est trop simpliste si vos ListBoxItems ont plus d'un bouton, mais dans de nombreux cas, cela fonctionne très bien.

Vous pouvez créer un contrôle utilisateur (.ascx) pour héberger la zone de liste.Ajoutez ensuite un événement public pour la page.

Public Event btnRemove()

Puis sur l'événement clic sur le bouton dans le contrôle utilisateur

RaiseEvent btnRemove()

Vous pouvez également transmettre des objets via l'événement comme n'importe quelle autre méthode.Cela permettra à votre contrôle utilisateur d'indiquer à votre page ce qu'il faut supprimer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top