Ich habe einen sehr einfachen und sauberen Weg gefunden, dies mit den Blend SDK Event-Triggern zu tun. Sauberes MVVM, wiederverwendbar und ohne Code-Behind.
Sie haben wahrscheinlich schon so etwas:
<Style x:Key="MyListStyle" TargetType="{x:Type ListViewItem}">
Fügen Sie jetzt eine ControlTemplate für das ListViewItem wie folgt hinzu, falls Sie noch keine verwenden:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<GridViewRowPresenter Content="{TemplateBinding Content}"
Columns="{TemplateBinding GridView.ColumnCollection}" />
</ControlTemplate>
</Setter.Value>
</Setter>
Der GridViewRowPresenter ist die visuelle Wurzel aller Elemente "innerhalb", aus denen ein Listenzeilenelement besteht. Jetzt könnten wir dort einen Trigger einfügen, um nach gerouteten MouseDoubleClick-Ereignissen zu suchen und einen Befehl über InvokeCommandAction wie folgt aufzurufen:
<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>
Wenn Sie visuelle Elemente "über" dem GridRowPresenter haben (wahrscheinlich beginnend mit einem Raster), können Sie den Trigger auch dort platzieren.
Leider werden MouseDoubleClick-Ereignisse nicht aus jedem visuellen Element generiert (sie stammen aus Steuerelementen, aber nicht beispielsweise aus FrameworkElements). Eine Problemumgehung besteht darin, eine Klasse von EventTrigger abzuleiten und nach MouseButtonEventArgs mit einem ClickCount von 2 zu suchen. Dadurch werden alle Nicht-MouseButtonEvents und alle MoseButtonEvents mit einem ClickCount! = 2 effektiv herausgefiltert.
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);
}
}
}
Jetzt können wir dies schreiben ('h' ist der Namespace der obigen Hilfsklasse):
<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>