Eine bessere Art und Weise, da Sie bei der Auswahl der Artikel nicht wirklich interessiert sind (weil es schnell sowieso bekommt gelöscht wird) wäre das Element selbst als Commandparameter an den Befehl zu übergeben.
Alternativ können Sie auf Umwegen entweder mit Code-Behind oder mit Triggern umgehen, aber ich denke nicht, dass es in Bezug auf den Punkt wäre. Zum Beispiel:
Sie die ButtonBase.Click Veranstaltung auf Ihrer listbox umgehen konnten, wie
<ListBox ButtonBase.Click="lb_Click"
...
dann in Ihrem Code hinter, dies zu tun:
private void lb_Click(object sender, RoutedEventArgs e)
{
object clicked = (e.OriginalSource as FrameworkElement).DataContext;
var lbi = lb.ItemContainerGenerator.ContainerFromItem(clicked) as ListBoxItem;
lbi.IsSelected = true;
}
dass das geklickt gebunden Element wird, Da der Datenkontext der Schaltfläche von dem Vorlagenobjekt übernommen wird, wird das tatsächlich automatisch generierte ListBoxItem aus dem ItemContainerGenerator der ListBox abgeleitet und die IsSelected-Eigenschaft auf true festgelegt. Ich denke, das ist einer der schnellsten und einfachsten Wege. Funktioniert auch mit mehreren von ButtonBase abgeleiteten Objekten in der Vorlage.
Natürlich kann man auch schön kapseln all dies (mehr oder weniger genau das gleiche) als wiederverwendbarer Behavior:
public class SelectItemOnButtonClick : Behavior<ListBox>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(handler), true);
}
protected override void OnDetaching()
{
this.AssociatedObject.RemoveHandler(ButtonBase.ClickEvent, new RoutedEventHandler(handler));
base.OnDetaching();
}
private void handler(object s, RoutedEventArgs e)
{
object clicked = (e.OriginalSource as FrameworkElement).DataContext;
var lbi = AssociatedObject.ItemContainerGenerator.ContainerFromItem(clicked) as ListBoxItem;
lbi.IsSelected = true;
}
}
Sie es wie folgt verwenden können:
<ListBox xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" ...>
<i:Interaction.Behaviors>
<local:SelectItemOnButtonClick />
</i:Interaction.Behaviors>
</ListBox>
Fehler hinzufügen Code wie mindestens Null-Checks natürlich zu behandeln - würde nicht eine einfache Sache wie diese Bombardierung Ihrer App wollen.
Um das Problem zu verstehen, setzt die Schaltfläche die Handled-Eigenschaft für alle Mausereignisse, die darauf einwirken (MouseDown/Click), so wahr, dass sie vom ListBoxItem nicht berücksichtigt werden. Sie können auch das MouseDown-Ereignis an die ListBox anhängen und den visuellen Baum nach oben führen, bis Sie das übergeordnete ListBoxItem erreichen, aber das ist viel komplizierter ... Wenn Sie neugierig sind, können Sie this article lesen, um zu wissen, warum, im Grunde genommen auch auf FrameworkContentElements stoßen (die auch auf MouseDown reagieren), so dass der Code komplizierter wird, mit dem Vorteil, dass alles, was in die Datamapte geklickt wird, das ListBoxItem auslöst, unabhängig davon, ob es das Ereignis als behandelt markiert hat.
Heh, ich habe auch versucht, es ausschließlich mit Stilen und Triggern zu tun, aber es wurde schnell hässlich und ich verlor das Interesse (und verlor den Überblick über all die ... irren Dinger). Grundsätzlich könnte es gelöst werden, denke ich, aber ich glaube nicht, dass es sich lohnt. Vielleicht habe ich etwas offensichtlich übersehen, weiß es nicht.
Ich könnte den Knopf durch den Befehl übergeben, und finde den Knopf auf der anderen Seite, aber das ist eine Art Hack, ich fühle ... –
Nun, ich löschte meine Antwort (dh einen Trigger hinzufügen, der das ListBoxItem auswählt wenn der Tastaturfokus innerhalb ist), denn auf den zweiten Blick ist es möglicherweise nicht der beste Weg, dies in den meisten Fällen zu handhaben. – ASanch
Das gleiche hier. Meine ursprüngliche Lösung war, "Self" an CommandParameter zu binden, und auf "executed" -Methode bekomme ich dann das LisBoxItem wie folgt: ListBoxItem selectedListBoxItem = ((ListBoxItem) MyListBox.ContainerFromElement ((DependencyObject) e.Parameter)); Aber ich glaube nicht, dass das sehr sauber ist ... –