2011-05-11 8 views
11

कि आप जानते हैं कि आप एक व्यवहार के बिना एक आदेश के लिए सीधे एक घटना बाध्य नहीं कर सकते हैं:एक शैली के EventTrigger के भीतर एक कमांड फायरिंग?

<DataGrid> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="PreviewMouseDoubleClick"> 
      <i:InvokeCommandAction Command="{Binding TradeEntryCommand"} /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</DataGrid> 

यह काम करता है बिल्कुल ठीक है, तथापि अब मैं सेल पर क्लिक दोगुना करने के लिए डेटा ग्रिड पर क्लिक करके डबल से इस refactor करने के लिए है । (मुझे परवाह नहीं है जो सेल क्लिक किया गया था)

मैं इस तरह सेल शैली के अंदर अब इस behviour परिभाषित करने के लिए उम्मीद कर रहा था:

<Style x:Key="DefaultCellStyleBase" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <ControlTemplate.Triggers> 
        <EventTrigger RoutedEvent="PreviewMouseDoubleClick"> 
         ????????? 
        </EventTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <!-- ... --> 
</Style> 

लेकिन यह कैसे मैं ऊपर से व्यवहार में लाना होगा आग आदेश?

अत्यधिक सराहना की,

+0

शैलियों में परिभाषित व्यवहार से संबंधित एसओ पर पहले से ही कुछ डुप्लिकेट हैं। संक्षेप में: आप कम से कम जटिल कोड-हुप्स के माध्यम से कूदने के बिना नहीं कर सकते हैं। मुझे EventToCommand व्यवहार से प्यार है, लेकिन इस तरह के मामलों में मुझे हमेशा दृश्यमान हैंडलर के साथ नियमित ईवेंट इवेंटेटर के साथ व्यूमोडेल कमांड निष्पादित करने के दृश्य पर जाना पड़ता है। यह गंदे लगता है, यह शामिल सभी शून्य जांच के साथ बदसूरत लग रहा है, लेकिन इसके लिए "समाधान" को देखते हुए यह शायद तब तक आसान है जब तक कि आप अपने आप को एक बड़े आवेदन में इस बार कई बार नहीं पाते। –

उत्तर

7

आप DataGridCell retemplating कर रहे हैं के बाद से, आप नियंत्रण टेम्पलेट में मूल तत्व को चलाता जोड़ सकते हैं। कुछ की तरह:

<ControlTemplate TargetType="{x:Type DataGridCell}"> 
    <Grid x:Name="root" Background="Transparent"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="PreviewMouseDoubleClick"> 
       <i:InvokeCommandAction Command="{Binding TradeEntryCommand}" /> 
      </i:EventTrigger>        
     </i:Interaction.Triggers> 
    </Grid> 
</ControlTemplate> 
+0

कोड बनाता है, जबकि मैं DataContext सही नहीं प्राप्त कर पा रहा हूं, क्योंकि यह कहीं भी निर्दिष्ट नहीं है। मैंने सफलता के बिना भी यह कोशिश की: Houman

+1

@ केव - कोशिश करें: कमांड = "{बाध्यकारी डेटाकॉन्टेक्स्ट। ट्रेड एंटर्री कमांड, सापेक्ष स्रोत = {सापेक्ष स्रोत ढूँढें पूर्वजों, पूर्वजों टाइप = दृश्य: MainWindow}} " – CodeNaked

2

एक संस्करण Thats मैं एक ऐसी ही स्थिति (DataGridRow में बटन में एक बटन-आदेश के लिए उपयोग कर रहा हूँ, डेटा ग्रिड पर कमान बटन द्वारा लाया जाना चाहिए और मैं अपने आदेश में पंक्ति के DataContext की जरूरत)। आपको इसके बजाए डबलक्लिक-ट्रिगर के InvokeCommandAction के कमांड का उपयोग करना होगा, लेकिन फिर मुझे यह भी काम करना चाहिए, मुझे लगता है।

शुभकामनाएं!

<DataTemplate> 
      <TextBlock>        
      <Button x:Name="cmdButton"        
            Command="{Binding Path=DataContext.CommandNameInViewModel, 
             RelativeSource={RelativeSource AncestorType={x:Type TypeOfAncestorWithTheViewModel}}}" 
            CommandParameter="{Binding}" >  
            Do something 
     </Button> 

    </TextBlock> 
</DataTemplate>  
संबंधित मुद्दे