Blend SDK Event tetikleyicileri ile bunu yapmanın çok kolay ve temiz bir yolunu buldum. Temiz MVVM, yeniden kullanılabilir ve arka planda kod yok.
Muhtemelen zaten böyle bir şeye sahipsiniz:
<Style x:Key="MyListStyle" TargetType="{x:Type ListViewItem}">
Zaten kullanmıyorsanız şimdi ListViewItem için bunun gibi bir ControlTemplate ekleyin:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<GridViewRowPresenter Content="{TemplateBinding Content}"
Columns="{TemplateBinding GridView.ColumnCollection}" />
</ControlTemplate>
</Setter.Value>
</Setter>
GridViewRowPresenter, bir liste satırı öğesini oluşturan "içindeki" tüm öğelerin görsel kökü olacaktır. Şimdi MouseDoubleClick yönlendirilmiş olayları aramak için oraya bir tetikleyici ekleyebilir ve InvokeCommandAction aracılığıyla şu şekilde bir komut çağırabiliriz:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<GridViewRowPresenter Content="{TemplateBinding Content}"
Columns="{TemplateBinding GridView.ColumnCollection}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding DoubleClickCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</GridViewRowPresenter>
</ControlTemplate>
</Setter.Value>
</Setter>
GridRowPresenter'ın "üstünde" görsel öğeleriniz varsa (olasılıkla bir ızgarayla başlayarak) Tetikleyiciyi oraya da koyabilirsiniz.
Ne yazık ki MouseDoubleClick olayları her görsel öğeden oluşturulmaz (bunlar Denetimlerden, ancak örneğin FrameworkElements'ten değil). Bir geçici çözüm, EventTrigger'dan bir sınıf türetmek ve ClickCount 2 olan MouseButtonEventArgs'ı aramaktır. Bu, bir ClickCount! = 2 ile MouseButtonEvents olmayan ve tüm MoseButtonEvents etkin bir şekilde filtreler.
class DoubleClickEventTrigger : EventTrigger
{
protected override void OnEvent(EventArgs eventArgs)
{
var e = eventArgs as MouseButtonEventArgs;
if (e == null)
{
return;
}
if (e.ClickCount == 2)
{
base.OnEvent(eventArgs);
}
}
}
Şimdi bunu yazabiliriz ('h' yukarıdaki yardımcı sınıfın Ad Alanıdır):
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<GridViewRowPresenter Content="{TemplateBinding Content}"
Columns="{TemplateBinding GridView.ColumnCollection}">
<i:Interaction.Triggers>
<h:DoubleClickEventTrigger EventName="MouseDown">
<i:InvokeCommandAction Command="{Binding DoubleClickCommand}" />
</h:DoubleClickEventTrigger>
</i:Interaction.Triggers>
</GridViewRowPresenter>
</ControlTemplate>
</Setter.Value>
</Setter>