Saya telah menemukan cara yang sangat mudah dan bersih untuk melakukan ini dengan pemicu Blend SDK Event. Membersihkan MVVM, dapat digunakan kembali dan tidak ada kode di belakang.
Anda mungkin sudah memiliki sesuatu seperti ini:
<Style x:Key="MyListStyle" TargetType="{x:Type ListViewItem}">
Sekarang sertakan ControlTemplate untuk ListViewItem seperti ini jika Anda belum menggunakannya:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<GridViewRowPresenter Content="{TemplateBinding Content}"
Columns="{TemplateBinding GridView.ColumnCollection}" />
</ControlTemplate>
</Setter.Value>
</Setter>
GridViewRowPresenter akan menjadi root visual dari semua elemen "di dalam" yang menyusun elemen baris daftar. Sekarang kita dapat memasukkan pemicu di sana untuk mencari peristiwa yang diarahkan MouseDoubleClick dan memanggil perintah melalui InvokeCommandAction seperti ini:
<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>
Jika Anda memiliki elemen visual "di atas" GridRowPresenter (mungkin dimulai dengan kisi) Anda juga dapat meletakkan Pemicu di sana.
Sayangnya event MouseDoubleClick tidak dibuat dari setiap elemen visual (mereka berasal dari Controls, tetapi tidak dari FrameworkElements misalnya). Solusinya adalah dengan mendapatkan kelas dari EventTrigger dan mencari MouseButtonEventArgs dengan ClickCount 2. Ini secara efektif menyaring semua non-MouseButtonEvents dan semua MoseButtonEvents dengan ClickCount! = 2.
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);
}
}
}
Sekarang kita bisa menulis ini ('h' adalah Namespace dari kelas helper di atas):
<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>