So wählen Sie ein ListBoxItem bei Klick auf button im Template?
Habe ich folgende Daten Vorlage angewendet wird, um ein ListBox:
<DataTemplate x:Key="MyTemplate" DataType="{x:Type DAL:Person}">
<StackPanel Orientation="Horizontal">
<Button Content="X" Command="{x:Static cmd:MyCommands.Remove}"/>
<TextBlock Text="{Binding Person.FullName}" />
</StackPanel>
</DataTemplate>
Wenn ich auf den button der Befehl wird ausgelöst, aber das ListBoxItem nicht ausgewählt werden. Wie kann ich erzwingen, dass es ausgewählt, so dass ich können Sie den ausgewählten Artikel in meinem "ausgeführt" - Methode?
Dank
- Ich könnte übergeben Sie die Schaltfläche über den Befehl, und suchen Sie den Knopf auf die andere Seite, aber das ist eine Art hack, fühle ich mich...
- Gut, ich löschte meine Antwort (D. H. fügen Sie einen trigger, der wählt die ListBoxItem, wenn Sie den Tastatur-Fokus innerhalb) denn auf den zweiten Gedanken, ist es vielleicht nicht der beste Weg, dies zu behandeln in den meisten Fällen.
- Hier gilt das gleiche. Meine erste Lösung war zu binden "Selbst" zu CommandParameter, und auf "ausgeführt" Methode, die ich dann bekommen die LisBoxItem wie folgt: ListBoxItem selectedListBoxItem = ((ListBoxItem) MyListBox.ContainerFromElement((DependencyObject) e.Parameter)); Aber ich glaube nicht, dass diese sehr sauber...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen besseren Weg, da Sie nicht wirklich interessiert bei der Auswahl der Artikel (weil es schnell kommen sowieso gelöscht würde) übergeben das Objekt selbst, um den Befehl als CommandParameter.
Alternativ können Sie gehen über in einem Kreisverkehr Weise entweder mit code-behind oder mit Triggern, aber ich glaube nicht, dass es sein würde wie auf den Punkt. Zum Beispiel:
Ihnen umgehen konnte der ButtonBase.Click-Ereignis deiner listbox, wie
dann in deinem code hinter, dies zu tun:
Bekommt das angeklickte Element gebunden, da der datacontext des Buttons geerbt von der Vorlagen-Element, und dann die tatsächliche automatisch generierte ListBoxItem aus dem Listenfeld die ItemContainerGenerator, und legt die IsSelected-Eigenschaft auf true. Ich denke, das ist eine der schnellsten und einfachsten Möglichkeiten. Funktioniert auch mit mehreren ButtonBase abgeleitete Objekte in der Vorlage.
Natürlich können Sie auch mehr sehr schön Kapseln alle diese (mehr oder weniger genau das gleiche) als eine wiederverwendbare Verhalten:
Können Sie es verwenden, wie diese:
Fügen Sie code zur Fehlerbehandlung wie mindestens null-checks, natürlich würde nicht wollen, eine einfache Sache wie diese Bombardierung Ihrer app.
Zu verstehen, das problem, die button-sets die Handled-Eigenschaft auf true für alle Maus-Ereignisse, die auf ihn einwirken (MouseDown/Click), so dass Sie sich nicht als von der ListBoxItem. Sie könnten auch befestigen Sie das MouseDown-Ereignis der ListBox aus und laufen Sie den visual tree nach oben, bis Sie erreichen der übergeordneten ListBoxItem aber das ist viel komplizierter... eh, wenn Sie neugierig sind, Lesen Sie dieser Artikel zu wissen, warum, im Grunde werden Sie auch Begegnung FrameworkContentElements (die reagieren auch auf MouseDown), so wird der code komplizierter, mit dem Kopf, dass irgendetwas angeklickt innerhalb des datatemplate wird, löst die ListBoxItem ausgewählt werden, unabhängig davon, ob es markiert das Ereignis als behandelt.
Heh, ich habe auch versucht, es zu tun, die ausschließlich mit styles und Trigger, aber es wurde schnell hässlich, und ich verlor das Interesse (und den überblick verloren, alle die... äh Dinger). Im Grunde könnte es gelöst werden, denke ich, aber ich reaaaly glaube nicht, dass es die Mühe Wert. Vielleicht habe ich etwas übersehen offensichtlich, obwohl, weiß nicht.
Machen die zugrunde liegenden Objekt-Exposés ein
RemoveCommand
Eigenschaft, und binden die SchaltflächeCommand
Eigenschaft. Dies vereinfacht die Daten-Vorlage; es vereinfacht den Fall Anwendung, wo die Logik diktieren, dass ein bestimmtes Element kann nicht entfernt werden.Alex, vielen Dank für die Antwort. Ihre Lösung mit Verhalten ist groß. Die erste Lösung ist nicht so gut, weil dass funktioniert nur, wenn Sie auf bestimmte Schaltfläche. Hier ist eine weitere Lösung, die die Arbeit auf klicken Sie auf willkürlichen Kontrolle form ListBoxItem Vorlage:
Ist, dass XAML-Ansatzes. Ich habe auch eingestellt, BasedOn-Eigenschaft nur um sicher zu sein, um nicht zu überschreiben die aktuellen ListBoxItem style.