मुझे ब्लेंड एसडीके इवेंट ट्रिगर्स के साथ ऐसा करने का बहुत आसान और साफ तरीका मिल गया है। साफ MVVM, पुन: प्रयोज्य और कोई कोड-पीछे।
आपके पास शायद पहले से ही ऐसा कुछ है:
<Style x:Key="MyListStyle" TargetType="{x:Type ListViewItem}">
अब इस तरह ListViewItem के लिए एक ControlTemplate शामिल करें यदि आप पहले से ही एक का उपयोग नहीं करते हैं:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<GridViewRowPresenter Content="{TemplateBinding Content}"
Columns="{TemplateBinding GridView.ColumnCollection}" />
</ControlTemplate>
</Setter.Value>
</Setter>
GridViewRowPresenter एक सूची पंक्ति तत्व बनाते हुए "अंदर" सभी तत्वों का दृश्य मूल होगा। अब हम माउसडबलक्लिक रूटेड ईवेंट देखने के लिए वहां एक ट्रिगर डाल सकते हैं और InvokeCommandAr के माध्यम से एक कमांड को कॉल कर सकते हैं जैसे कि:
<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 (एक ग्रिड से शुरू होने वाला लम्बा) दृश्य तत्व "ऊपर" है तो आप वहाँ ट्रिगर भी रख सकते हैं।
दुर्भाग्य से MouseDoubleClick घटनाएं प्रत्येक दृश्य तत्व से उत्पन्न नहीं होती हैं (वे नियंत्रण से हैं, लेकिन उदाहरण के लिए फ्रेमवर्क से नहीं)। एक वैकल्पिक हल EventTrigger से एक वर्ग प्राप्त करने के लिए और एक ClickCount 2 के साथ MouseButtonEventArgs की तलाश है। यह प्रभावी रूप से एक ClickCount के साथ सभी गैर- MouseButtonEvents और सभी MoseButtonEvents बाहर फ़िल्टर करता है! = 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);
}
}
}
अब हम इसे लिख सकते हैं ('h' ऊपर के सहायक वर्ग का नाम स्थान है):
<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>