2013-01-13 5 views
6

मैं केवल उपयोगकर्ता इंटरैक्शन/चयन के लिए WPF DataGrid तत्व में SelectionChanged ईवेंट को संभालना चाहता हूं और बाध्यकारी या अन्य सेट मानों के कारण छोड़ सकता हूं। कोई विचार है कि मैं कैसे निर्धारित करूंगा कि चयन उपयोगकर्ता परिवर्तन से बदल गया है या नहीं? या कोई वैकल्पिक घटना जो समान कार्य करेगी?क्या WPF में चयन चेंज किया गया ईवेंट केवल उपयोगकर्ता इंटरैक्शन के लिए संभाला जा सकता है?

+0

क्या आप कुछ नमूना कोड दिखा सकते हैं जो आप प्राप्त करने की कोशिश कर रहे हैं? –

उत्तर

10

शायद ईवेंट PreviewMouseDown ईवेंट के साथ गठबंधन करने का प्रयास करें। जब उपयोगकर्ता एक पंक्ति पर क्लिक करता है तो आप कुछ संपत्ति सेट करते हैं और SelectionChanged ईवेंट हैंडलर चेक में संपत्ति की तुलना में चेक किया गया था।

नमूना कोड XAML:

<DataGrid SelectionChanged="OnSelectionChanged" PreviewMouseDown="OnPreviewMouseDown"> 
     <!--some code-->   
</DataGrid> 

कोड के पीछे:

bool isUserInteraction; 

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (isUserInteraction) 
    { 
     //some code 

     isUserInteraction = false; 
    } 
} 

private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    isUserInteraction = true; 
} 
+0

धन्यवाद राफल, उस चाल ने मदद की। धन्यवाद! –

+0

क्या कोई कारण बता सकता है, इसे अलग घटना के रूप में क्यों लागू नहीं किया गया है ...? एमवीवीएम-पैटर्न का उपयोग करके परिवर्तन हमेशा डेटाकॉन्टेक्स्ट को सेट करने पर भी आग लग जाता है ....:/+1 इस चाल के लिए राफल ':) – dba

+0

मुझे लगता है कि यह कई मामलों में विफल हो जाएगा: (1) यदि उपयोगकर्ता किसी तरीके से क्लिक करता है जिसके परिणामस्वरूप चयन परिवर्तन नहीं हुआ (उदाहरण के लिए पहले से चुनी गई पंक्ति पर क्लिक करना, या संशोधक का उपयोग करना, या विभिन्न माउस बटन), फिर चयन बाध्यकारी के कारण बदलता है, बाध्यकारी उपयोगकर्ता क्रिया के रूप में देखा जाएगा। (2) यदि उपयोगकर्ता चयन बदलने के लिए कीबोर्ड का उपयोग करता है, तो उसे उपयोगकर्ता कार्रवाई के रूप में नहीं देखा जाएगा। – hypehuman

0

हाय आप इस XAML में उपयोग कर सकते हैं:

<ComboBox x:Name="ComboBoxName" SelectionChanged="ComboBox_SelectionChanged"> 
             <ComboBox.Style> 
              <Style TargetType="ComboBox"> 
               <Style.Triggers>              
                <Trigger Property="IsDropDownOpen" Value="True"> 
                 <Setter Property="IsEditable" Value="True"></Setter> 
                </Trigger> 
               </Style.Triggers> 
              </Style> 
             </ComboBox.Style> 
            </ComboBox> 

और पीछे कोड में:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (!((ComboBox)sender).IsEditable) return; 
     //Do Stuff; 
    } 
0

कॉम्बोबॉक्स की DropDownOpened और DropDownClosed ईवेंट को संभालने का एक और तरीका होगा। यह राफल के स्वीकृत उत्तर से थोड़ा बेहतर है क्योंकि यह बूलियन झंडा को सच में फंसने से रोकता है अगर उपयोगकर्ता कॉम्बोबॉक्स पर क्लिक करता है और उसके बाद कॉम्बोबॉक्स को चयन किए बिना बंद करने के लिए कहीं और क्लिक किया जाता है। यह हल नहीं करता है, हालांकि, यदि कॉम्बोबॉक्स में कीबोर्ड फोकस है और उपयोगकर्ता चयन को बदलने के लिए ऊपर और नीचे तीरों को टैप करता है।

private void Event_ComboBox_DropDownOpened(object sender, EventArgs e) 
{ 
    isUserInteraction = true; 
} 

private void Event_ComboBox_DropDownClosed(object sender, EventArgs e) 
{ 
    isUserInteraction = false; 
} 

private void Event_ComboBox_SelectedChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (isUserInteraction) 
    { 
     // Do work 
    } 
} 
संबंधित मुद्दे

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