Tôi đã tìm thấy một cách rất dễ dàng và rõ ràng để thực hiện việc này với các trình kích hoạt Sự kiện Blend SDK. MVVM sạch, có thể tái sử dụng và không có mã phía sau.
Bạn có thể đã có một cái gì đó như thế này:
<Style x:Key="MyListStyle" TargetType="{x:Type ListViewItem}">
Bây giờ, hãy bao gồm ControlTemplate cho ListViewItem như thế này nếu bạn chưa sử dụng:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<GridViewRowPresenter Content="{TemplateBinding Content}"
Columns="{TemplateBinding GridView.ColumnCollection}" />
</ControlTemplate>
</Setter.Value>
</Setter>
GridViewRowPresenter sẽ là gốc trực quan của tất cả các phần tử "bên trong" tạo thành phần tử hàng danh sách. Bây giờ chúng ta có thể chèn một trình kích hoạt ở đó để tìm kiếm các sự kiện được định tuyến MouseDoubleClick và gọi một lệnh thông qua InvokeCommandAction như sau:
<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>
Nếu bạn có các yếu tố hình ảnh "phía trên" GridRowPresenter (probalby bắt đầu bằng lưới), bạn cũng có thể đặt Trigger ở đó.
Rất tiếc, các sự kiện MouseDoubleClick không được tạo từ mọi yếu tố hình ảnh (chúng từ Controls, nhưng không phải từ FrameworkElements chẳng hạn). Một cách giải quyết là lấy một lớp từ EventTrigger và tìm MouseButtonEventArgs với ClickCount là 2. Điều này lọc ra một cách hiệu quả tất cả những không phải MouseButtonEvents và tất cả MoseButtonEvents có 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);
}
}
}
Bây giờ chúng ta có thể viết thế này ('h' là Không gian tên của lớp trình trợ giúp ở trên):
<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>