Quería resolver esto sin necesidad de manejar el evento double click listBoxItem en el código subyacente, y no quería tener que anular el estilo listBoxItem (o definir el estilo para sobrescribir en primer lugar). Quería simplemente disparar un comando cuando el listBox estaba doblemente marcado.
creé una propiedad asociada al igual que (el código es muy específica, pero se puede generalizar en los términos requeridos):
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);
}
}
entonces declarar mi ListBox con los bienes embargados y mi comando de destino:
<ListBox ItemsSource="{Binding SomeItems}"
myStuff:ControlItemDoubleClick.ItemsDoubleClick="true">
<ListBox.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="MyCommand"/>
</ListBox.InputBindings>
</ListBox>
Espero que esto ayude.
Gracias. Esto resuelve mi problema también. Un seguimiento: esto funciona muy bien en la aplicación en ejecución, pero cubre al diseñador de estudio visual (no es una maravilla, sino una irritación). No defino explícitamente un estilo ListBoxItem en los recursos de la aplicación, por lo que el BasedOn fallará en el momento del diseño. Sin embargo, tengo una biblioteca de tematización (WPFTheme) que define este recurso en tiempo de ejecución. Si defino un recurso estático, borra el dinámico, temático. ¿Alguna idea sobre cómo puedo hacer que ambos jueguen bien juntos? – el2iot2
Después de un poco más de experimentación, lo resolví ... Acabo de hacer referencia al xaml del tema en una propiedad de recursos fusionados: –
el2iot2
This es bastante genial, pero ¿y si ya ha definido ItemContainerStyle en ResourceDictionary? – Oliver