Замена ControlTemplate
на ListViewItem
с использованием стиля не является плохим решением. На самом деле, это был бы мой первый выбор.
Еще один способ сделать то же самое - использовать пользовательское свойство в вашем стиле ListViewItem
:
<Style TargetType="ListViewItem">
<Setter Property="local:AddToInputBinding.Binding">
<Setter.Value>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />
</Setter.Value>
</Setter>
...
Для этого необходимо создать вложенное свойство MyBindingHandler.AddBinding:
public class AddToInputBinding
{
public static InputBinding GetBinding(... // create using propa snippet
public static void SetBinding(...
public static readonly DependencyProperty BindingProperty = DependencyProperty.RegisterAttached(
"Binding", typeof(InputBinding), typeof(AddToInputBinding), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
((UIElement)obj).InputBindings.Add((InputBinding)e.NewValue);
}
}));
}
Это может быть расширено для обработки нескольких привязок, но вы поймете, что идея: Этот класс позволяет вам добавлять InputBinding внутри любого стиля.
Это решение может быть предпочтительнее, чем то, что вы делаете, потому что привязка DoubleClick определяется непосредственно в ListBoxItem, а не в другом элементе управления внутри его шаблона. Но я думаю, что это в основном сводится к личным предпочтениям.