2011-04-27 13 views
9

में डबल क्लिक करें मैं विकसित किया है कि एक पिक सूची के रूप में प्रयोग की जाने वाली इस प्रकार करना है एक WPF UserControl:करने के लिए एक कमांड बाध्य करने के लिए कैसे एक पंक्ति पर डेटा ग्रिड

  • एक डेटा ग्रिड संस्थाओं की एक CollectionView करने के लिए बाध्य (उदाहरण के लिए कर्मचारी)
  • डेटाग्रिड के ऊपर एक टेक्स्टबॉक्स जिसका उपयोग डेटाग्रिड में प्रदर्शित वस्तुओं को फ़िल्टर करने के लिए किया जा सकता है।

मैं एक कमांड का खुलासा करना चाहता हूं जिसे उपयोगकर्ता डेटाग्रिड में पंक्ति पर डबल-क्लिक करते समय निष्पादित किया जाएगा। इसके बाद कंटेनर डेटाग्रिड में चयनित इटैम के साथ कुछ कर कर प्रतिक्रिया दे सकता है।

अब तक मैं संभाल करने की कोशिश की है डबल क्लिक करें इस प्रकार है:

<DataGrid IsReadOnly="True"> 
    <DataGrid.InputBindings> 
     <MouseBinding MouseAction="LeftDoubleClick" Command="... /> 
    </DataGrid.InputBindings> 
... 

हालांकि डबल क्लिक करें घटना अभी भी डेटा ग्रिड शीर्षक में जब उपयोगकर्ता क्लिक सक्रिय करता है। मैं इसे सीमित करने में सक्षम होना चाहता हूं ताकि कमांड केवल तभी निष्पादित किया जा सके जब डबल क्लिक डेटाग्रिड के शरीर में हो। क्या ऐसा करने का कोई घोषणात्मक तरीका है?

अद्यतन

मैं सिर्फ WPF और MVVM साथ पकड़ के लिए हो रही है, और वास्तव में कैसे इस तरह निम्न स्तर के पुन: प्रयोज्य घटकों को लागू करने पर मार्गदर्शन के लिए देख रहा हूँ। किसी भी सामान्य सलाह को भी कृतज्ञतापूर्वक प्राप्त किया जाएगा और ऊपर उठाया जाएगा। यह खड़ा के रूप में, मैं यह सोचते हैं रहा हूँ मैं करने के लिए इस UserControl चाहते हैं:

  • निर्भरता संपत्ति "SelectedItem" है कि डेटा ग्रिड के SelectedItem

  • बेनकाब एक RoutedEvent "ItemDoubleClick" या कि इसी तरह के लिए बाध्य है बेनकाब उपयोगकर्ता को पंक्ति पर डबल-क्लिक करते समय निकाल दिया जाता है।

  • ICommandSource लागू करें और डबल-क्लिक ईवेंट हैंडलर से CommandHelpers.ExecuteCommandSource(this) पर कॉल करें।

उत्तर

10

तो कोड के पीछे एक समस्या नहीं है:

<DataGrid.RowStyle> 
    <Style TargetType="{x:Type DataGridRow}"> 
     <EventSetter Event="Loaded" Handler="Row_Loaded"/> 
    </Style> 
</DataGrid.RowStyle> 
private void Row_Loaded(object sender, RoutedEventArgs e) 
{ 
    var row = sender as DataGridRow; 
    row.InputBindings.Add(new MouseBinding(MyCommands.MyCommand, 
      new MouseGesture() { MouseAction = MouseAction.LeftDoubleClick })); 
} 
+0

+1 धन्यवाद - यह वही है जो मैं प्राप्त करना चाहता हूं, लेकिन मैं सोच रहा था कि ऐसा करने के लिए एक घोषणात्मक तरीका है या नहीं। – Joe

+0

मुझे संदेह है कि एक आसान तरीका है; आप [ब्लेंड एसडीके] (http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f1ae9a30-4928-411d-970b-e682ab179e17&displaylang=en) से 'इंटरएक्टिविटी' का उपयोग करके आदेशों को पाइप कर सकते हैं और एक 'EventToCommandAction', समस्या यह है कि एक शैली में अंतःक्रियाशीलता का उपयोग ** बहुत जटिल ** है, लेकिन यदि आपको परेशानी नहीं है [तरीके हैं] (http://stackoverflow.com/questions/1647815/how- टू-एड-एक-मिश्रण-व्यवहार में एक शैली-सेटर/4779168 # 4779168)। –

+0

@ एचबी मैं बस एमवीवीएम के साथ पकड़ने के लिए जा रहा हूं और अब केआईएसएस चाहता हूं, इसलिए मुझे लगता है कि मैं कोडबैंड समाधान के लिए जाऊंगा।आपके समाधान के बारे में एक टिप्पणी - यह संभावित रूप से प्रत्येक पंक्ति के लिए माउसबाइंडिंग बना रहा है क्योंकि यह डेटाग्रिड में जोड़ा गया है - क्या बड़ी संख्या में पंक्तियां होने पर यह थोड़ा अक्षम हो सकता है? अगर मैं कोडबेंड मार्ग पर जा रहा हूं, तो मुझे आश्चर्य है कि क्या यह DataGrid.MouseDoubleClick ईवेंट को संभालने के लिए और अधिक कुशल होगा, यह सुनिश्चित करने के लिए परीक्षण करें कि मैं एक पंक्ति में हूं, फिर कमांड निष्पादित करें। – Joe

0

आप बस एक ग्रिड में डेटा ग्रिड डाल दिया और ग्रिड में अपने InputBindings परिभाषित कर सकते हैं। CanExecute-definition में, यदि कोई पंक्ति चुना गया है, तो आपको जांच करनी चाहिए। यह कुंजीबाइंडिंग के लिए भी काम करता है, उदाहरण के लिए एक कस्टम डिलीट-कमांड।

<Grid> 
     <Grid.InputBindings> 
      <MouseBinding MouseAction="LeftDoubleClick" Command="... /> 
     </Grid.InputBindings> 
     <DataGrid IsReadOnly="True"> 
     ... 
</Grid> 
+0

यह जोड़ने के बाद मेरा आवेदन जमा हो जाता है। –

+0

इसके साथ समस्या यह है कि आप पंक्ति में एक बार चयन करने के बाद, केवल पंक्ति पर ही नहीं, ग्रिड में कहीं भी डबल-क्लिक कर सकते हैं। –