Frage

Ich habe eine ListBox, für die ein Stil für ListBoxItems definiert ist.In diesem Stil habe ich einige Etiketten und einen Knopf.Für diese Schaltfläche möchte ich ein Klickereignis definieren, das auf meiner Seite (oder jeder Seite, die diesen Stil verwendet) verarbeitet werden kann.Wie erstelle ich einen Ereignishandler auf meiner WPF-Seite, um das Ereignis aus meinem ListBoxItems-Stil zu verarbeiten?

Hier ist mein Stil (nur betroffener Code):

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

Danke!

War es hilfreich?

Lösung

Schauen Sie mal rein RoutedCommandS.

Definieren Sie Ihren Befehl irgendwo in myclass wie folgt:

    public static readonly RoutedCommand Login = new RoutedCommand();

Definieren Sie nun Ihre Schaltfläche mit diesem Befehl:

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

Sie können CommandParameter für zusätzliche Informationen verwenden.

Zu guter Letzt hören Sie sich nun Ihren Befehl an:

Im Konstruktor der Klasse, die Sie ein paar nette Dinge tun möchten, platzieren Sie Folgendes:

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

oder in XAML:

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

Und Sie implementieren den Delegaten, den die CommandBinding benötigt:

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

Sie können diesen Befehl überall in Ihrem visuellen Baum abhören!

Hoffe das hilft

PS: Sie können die CommandBinding auch mit einem CanExecute-Delegaten definieren, der Ihren Befehl sogar deaktiviert, wenn CanExecute dies sagt :)

PPS Hier ist ein weiteres Beispiel: RoutedCommands in WPF

Andere Tipps

Wie Arcturus schrieb, sind RoutedCommands eine großartige Möglichkeit, dies zu erreichen.Wenn Ihr DataTemplate jedoch nur eine Schaltfläche enthält, ist dies möglicherweise etwas einfacher:

Sie können tatsächlich das Click-Ereignis einer beliebigen Schaltfläche von der Host-ListBox aus wie folgt verarbeiten:

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

Alle in der ListBox enthaltenen Schaltflächen lösen dieses Ereignis aus, wenn darauf geklickt wird.Innerhalb des Event-Handlers können Sie e.OriginalSource verwenden, um einen Verweis zurück auf die Schaltfläche zu erhalten, auf die geklickt wurde.

Dies ist natürlich zu einfach, wenn Ihre ListBoxItems mehr als eine Schaltfläche haben, aber in vielen Fällen funktioniert es einwandfrei.

Sie könnten ein Benutzersteuerelement (.ascx) erstellen, um die Listbox unterzubringen.Fügen Sie dann ein öffentliches Ereignis für die Seite hinzu.

Public Event btnRemove()

Dann auf das Button-Click-Ereignis in der Benutzersteuerung

RaiseEvent btnRemove()

Sie können Objekte wie jede andere Methode auch durch das Ereignis übergeben.Dadurch kann Ihre Benutzersteuerung Ihrer Seite mitteilen, was gelöscht werden soll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top