Chciałem rozwiązać ten problem bez konieczności obsługi zdarzenia double click click listBoxItem w kodzie z tyłu i nie chciałem mieć nadpisania stylu listBoxItem (lub zdefiniować styl do przesłonięcia w pierwszej kolejności). Chciałem po prostu wystrzelić komendę po dwukrotnym kliknięciu listBox.
stworzyłem załączony właściwość jak tak (kod jest bardzo specyficzny, ale można ją uogólnić jako wymagane):
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);
}
}
I wtedy zadeklarować moje ListBox z załączonym nieruchomości i mój Polecenie celu:
<ListBox ItemsSource="{Binding SomeItems}"
myStuff:ControlItemDoubleClick.ItemsDoubleClick="true">
<ListBox.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="MyCommand"/>
</ListBox.InputBindings>
</ListBox>
Mam nadzieję, że to pomoże.
Dzięki. To rozwiązuje również mój problem. Jedna obserwacja: Działa to świetnie w uruchomionej aplikacji, ale łączy w sobie projektanta studio wizualnego (nie showstopper, ale irytacja). Nie definiuję jawnie stylu ListBoxItem w zasobach aplikacji, więc BasedOn zawiedzie w czasie projektowania. Mam jednak bibliotekę tematów (WPFTheme), która definiuje ten zasób w czasie wykonywania. Jeśli zdefiniuję statyczny zasób, spowoduje to zatarcie dynamicznego, tematycznego. Czy są jakieś przemyślenia na temat tego, w jaki sposób mogę sprawić, by obie grały razem? – el2iot2
Po nieco więcej eksperymentów, odkryłem to ... Właśnie odwoływałem się do xaml tematu w właściwości mergedresource: –
el2iot2
To jest całkiem fajny, ale co jeśli już zdefiniowałeś ItemContainerStyle w ResourceDictionary? – Oliver