Ich wollte dies lösen, ohne das ListBoxItem-Doppelklick-Ereignis im Code-Behind behandeln zu müssen, und ich wollte nicht den listBoxItem-Stil überschreiben (oder den zu überschreibenden Stil an erster Stelle definieren). Ich wollte nur einen Befehl auslösen, wenn die ListBox doppelt geklickt wurde.
Ich hat eine angefügten Eigenschaft wie so (der Code ist sehr spezifisch, aber man kann es verallgemeinert je nach Bedarf):
public class ControlItemDoubleClick : DependencyObject {
public ControlItemDoubleClick()
{
}
public static readonly DependencyProperty ItemsDoubleClickProperty =
DependencyProperty.RegisterAttached("ItemsDoubleClick",
typeof(bool), typeof(Binding));
public static void SetItemsDoubleClick(ItemsControl element, bool value)
{
element.SetValue(ItemsDoubleClickProperty, value);
if (value)
{
element.PreviewMouseDoubleClick += new MouseButtonEventHandler(element_PreviewMouseDoubleClick);
}
}
static void element_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
ItemsControl control = sender as ItemsControl;
foreach (InputBinding b in control.InputBindings)
{
if (!(b is MouseBinding))
{
continue;
}
if (b.Gesture != null
&& b.Gesture is MouseGesture
&& ((MouseGesture)b.Gesture).MouseAction == MouseAction.LeftDoubleClick
&& b.Command.CanExecute(null))
{
b.Command.Execute(null);
e.Handled = true;
}
}
}
public static bool GetItemsDoubleClick(ItemsControl element)
{
return (bool)element.GetValue(ItemsDoubleClickProperty);
}
}
ich dann meine ListBox mit der angefügten Eigenschaft erklären und meinem Zielbefehl:
<ListBox ItemsSource="{Binding SomeItems}"
myStuff:ControlItemDoubleClick.ItemsDoubleClick="true">
<ListBox.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="MyCommand"/>
</ListBox.InputBindings>
</ListBox>
Hoffe, das hilft.
Danke. Das löst auch mein Problem. One Followup: Das funktioniert gut in der laufenden Anwendung, aber es schlaucht den visuellen Studio-Designer (kein Showstopper, aber eine Irritation). Ich definiere nicht explizit einen ListBoxItem-Stil in den Anwendungsressourcen, sodass das BasedOn zur Entwurfszeit fehlschlägt. Ich habe jedoch eine Theming-Bibliothek (WPFTheme), die diese Ressource zur Laufzeit definiert. Wenn ich eine statische Ressource definiere, verwischt sie die dynamische, thematische Ressource. Irgendwelche Gedanken darüber, wie ich beide gut zusammen spielen lassen kann? – el2iot2
Nach etwas mehr experimentieren, ich fand es heraus ... Ich referenzierte gerade das xaml des Themas in einer mergedresource Eigenschaft: –
el2iot2
This ist ziemlich cool, aber was, wenn Sie ItemContainerStyle bereits in einem ResourceDictionary definiert haben? – Oliver