Ich habe einen sehr einfachen und sauberen Weg gefunden, dies mit den Blend SDK Event Triggern zu tun. Säubere MVVM, wiederverwendbar und ohne Code-Behind.
Sie haben wahrscheinlich schon so etwas wie dieses:
<Style x:Key="MyListStyle" TargetType="{x:Type ListViewItem}">
Jetzt gehören ein Control für die ListViewItem wie diese, wenn Sie nicht bereits über ein verwenden:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<GridViewRowPresenter Content="{TemplateBinding Content}"
Columns="{TemplateBinding GridView.ColumnCollection}" />
</ControlTemplate>
</Setter.Value>
</Setter>
Die GridViewRowPresenter wird die visuelle sein Wurzel aller Elemente "innen", die ein Listenzeilenelement bilden. Jetzt konnten wir einen Trigger dort einsetzen suchen Mousedoubleclick-Ereignisse geleitet und rufen Sie einen Befehl über InvokeCommandAction wie folgt aus:
<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“ die GridRowPresenter haben (via Modem mit einem Raster ausgehend) können Sie auch setzen der Auslöser dort.
Leider werden MouseDoubleClick-Ereignisse nicht von jedem visuellen Element generiert (sie stammen aus Steuerelementen, aber nicht aus beispielsweise FrameworkElements). Eine Abhilfe ist, eine Klasse von Eventtrigger abzuleiten und suchen Sie nach MouseButtonEventArgs mit einem Clickcount 2. Diese effektiv alle Nicht-MouseButtonEvents herausfiltert und alle MoseButtonEvents mit einem 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);
}
}
}
Jetzt können wir das schreiben ('h' ist der Namespace der Hilfsklasse oben):
<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>
+1 Ich habe festgestellt, dass dies meine bevorzugte Lösung bei der Arbeit mit Composite Application Guidance für WPF (Prism) ist. –
Wofür steht der Namespace 'acb:' in Ihrem Codebeispiel? –
@NamGiVU 'acb:' = AttachedCommandBehavior. Der Code kann in der ersten Verbindung in der Antwort gefunden werden – Rachel