2009-12-10 8 views
5

डबल-क्लिक करें, इवेंट टोकॉमैंड का उपयोग करने के तरीके को जानने के लिए पंक्तियों के लिए डेटाग्रिड डबल क्लिक हैंडलर सेट करने के लिए। आदेश प्रत्येक पंक्ति के लिए व्यूमोडेल में रहता है। बस कि मेरे अनुभव से बहुत अधिक है, क्योंकि मैंने अभी तक इंटरैक्शन का उपयोग नहीं किया है।एमवीवीएमलाइट इवेंट टॉम कमांड और डब्ल्यूपीएफटीयूएलकिट डाटाग्रिड

धन्यवाद।

मैं mvvmlight टैग का उपयोग करता, लेकिन मेरे पास नए टैग बनाने के लिए अभी तक पर्याप्त पर्याप्त प्रतिनिधि नहीं है।

+0

मैंने आपके लिए एमवीवीएम-लाइट टैग जोड़ा। यह लॉरेन बग्नियन के एमवीवीएम लाइट टूलकिट के लिए उपयोग करने वाला आधिकारिक है। – dthrasher

उत्तर

11

यह आदेश समाधान होगा यदि कमांड "GridVieModel" पर रहता है और "RowViewModel" पर नहीं।

<Window...  
     ...xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
      xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
      xmlns:GalaSoft_MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"> 
     <dg:DataGrid x:Name="dg"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="MouseDoubleClick"> 
          <GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding SelectedItem, ElementName=dg}" Command="{Binding Path=SelectCommand, Mode=OneWay}"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
      </dg:DataGrid> 
    </Window> 

आप के बाद से पंक्ति भी अपने स्वयं के viewmodel है एक rowview बना सकते हैं और rowview में पंक्ति (कंटेनर) के चाइल्ड तत्व के mousedoubleclick घटना इस्तेमाल कर सकते हैं।

या आप बाध्यकारी अपने आदेश के लिए एक कनवर्टर बनाएँ:

<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding SelectedItem, ElementName=dg, Mode=OneWay, Converter=...}"/> 

कनवर्टर फिर अगर SelectedItem (एक RelayCommand संपत्ति के साथ ISelectCommandable तरह)

+0

फटा हुआ ... मुझे लंबे समय तक इसे आजमाने का मौका नहीं मिलेगा, लेकिन इसे अनुत्तरित छोड़ना नहीं चाहते हैं। यह सिद्धांत में सही दिखता है, लेकिन मैं वास्तव में कुछ चाहता था जहां कमांड RowViewModel पर था। <डीजी: डेटाग्रिड x: नाम = "डीजी" आइटम = "रोवएमएमसीलेक्शन"> या शायद आप यह कह रहे हैं कि डेटाग्रिड एक डबल क्लिक प्रदान नहीं करता है जो शामिल पंक्ति की पहचान करने में सहायता करता है? – Thomas

+0

कनवर्टर के पीछे विचार यह था कि कनवर्टर चयनित इटैम को रोकता है और कमांड देता है। इस तरह आप RowViewModel पर कमांड कहलाते थे (मुझे वास्तव में यकीन नहीं है कि आपको इसकी आवश्यकता भी है या यदि आप चयनित इटैम। सिलेक्ट कॉमांड जैसे कुछ कर सकते हैं) यह पहचानने के लिए कि क्या पंक्ति को डबलक्लेक्ड किया गया है, आपको EventArgs की आवश्यकता होगी। लेकिन आप इसे एमवीवीएम-लाइट टूलकिट के साथ वापस कर सकते हैं। – CodeWeasel

+0

के, नमूना वाक्यविन्यास के लिए धन्यवाद। अगर मैं कभी भी इस विधि को आजमाने के लिए घूमता हूं तो मैं फिर से जवाब दूंगा। – Thomas

4
आदेश वापस जाने के लिए आवश्यक प्रकार की है की जाँच करेगा

मामले किसी में यहाँ देख आता है और चमत्कार मैं इसे कैसे डब्ल्यू/EventToCommand

public class DataGridAttachedBehaviors 
{ 
    #region DoubleClick 

    public static DependencyProperty OnDoubleClickProperty = DependencyProperty.RegisterAttached(
     "OnDoubleClick", 
     typeof(ICommand), 
     typeof(DataGridAttachedBehaviors), 
     new UIPropertyMetadata(DataGridAttachedBehaviors.OnDoubleClick)); 

    public static void SetOnDoubleClick(DependencyObject target, ICommand value) 
    { 
     target.SetValue(DataGridAttachedBehaviors.OnDoubleClickProperty, value); 
    } 

    private static void OnDoubleClick(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     var element = target as Control; 
     if (element == null) 
     { 
     throw new InvalidOperationException("This behavior can be attached to a Control item only."); 
     } 

     if ((e.NewValue != null) && (e.OldValue == null)) 
     { 
     element.MouseDoubleClick += MouseDoubleClick; 
     } 
     else if ((e.NewValue == null) && (e.OldValue != null)) 
     { 
     element.MouseDoubleClick -= MouseDoubleClick; 
     } 
    } 

    private static void MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     UIElement element = (UIElement)sender; 
     ICommand command = (ICommand)element.GetValue(DataGridAttachedBehaviors.OnDoubleClickProperty); 
     command.Execute(null); 
    } 

    #endregion DoubleClick 

    #region SelectionChanged 
    //removed 
    #endregion 
} 

मेरी XAML में कर समाप्त हो गया:

<dg:DataGrid.RowStyle> 
    <Style BasedOn="{StaticResource DataGridDemoRowStyle}"   
      TargetType="{x:Type dg:DataGridRow}"> 
     <Setter Property="skins:DataGridAttachedBehaviors.OnDoubleClick" 
       Value="{Binding Recall}" /> 
    </Style> 
</dg:DataGrid.RowStyle> 
+0

बस इसे देखा और विवरण देखने पर बहुत अधिक समय व्यतीत किए बिना: क्या आप वास्तव में यहां केवल इवेंट टॉम कॉमांड लाइट को लागू नहीं कर रहे हैं? – carlsb3rg

+0

पता नहीं है कि मैं इसे भी कह सकता हूं, क्योंकि यह डबल क्लिक करने के लिए बहुत विशिष्ट है, लेकिन निश्चित है। – Thomas

संबंधित मुद्दे