2011-09-28 7 views
13

के अंदर बाध्यकारी कमांड मेरे पास कमांड के साथ मेरे व्यूमोडेल से जुड़ा व्यू (एक्सएएमएल शामिल) है। डेटाग्रिड की पंक्ति पर बटन पर क्लिक करने पर मुझे कमांड का आह्वान करने की आवश्यकता है। मैं इसके लिए व्यवहार का उपयोग कर रहा हूं (नियमित कमांडिंग में एक ही समस्या है)। जब मैं डेटाग्रिड पर बटन क्लिक करता हूं - मेरा आदेश निकाल दिया नहीं जाता है।DataGridTemplateColumn

समस्या को चित्रित करने के लिए - मैंने नीचे एक ही बाध्यकारी सामग्री के साथ सूची बॉक्स को नीचे रखा - और हाँ, कमांड काम करता है। इसलिए, यह डेटा ग्रिड/DataGridTemplateColumn के साथ कुछ

<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding}"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="30" /> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <StackPanel Orientation="Horizontal"> 
       <Button Content="Cancel" > 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="Click"> 
          <ei:CallMethodAction MethodName="Cancel" TargetObject="{Binding}"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </Button> 
      </StackPanel> 
      <sdk:DataGrid AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding Data}" Grid.Row="1"> 
       <sdk:DataGrid.Columns> 
        <sdk:DataGridTemplateColumn CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto"> 
         <sdk:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <Button Content="Select"> 
            <i:Interaction.Triggers> 
             <i:EventTrigger EventName="Click"> 
              <i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" /> 
             </i:EventTrigger> 
            </i:Interaction.Triggers> 
           </Button> 
          </DataTemplate> 
         </sdk:DataGridTemplateColumn.CellTemplate> 
        </sdk:DataGridTemplateColumn> 
        <sdk:DataGridTextColumn Binding="{Binding DeviceId}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Device" Width="Auto" FontWeight="Bold" /> 
        <sdk:DataGridTextColumn Binding="{Binding SerialNumber}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Serial Number" Width="Auto" /> 
        <sdk:DataGridTextColumn Binding="{Binding LastActivityOn}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Last Activity" Width="Auto" /> 
        <sdk:DataGridTextColumn Binding="{Binding ClientVersion}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Client Version" Width="Auto" /> 
        <sdk:DataGridTextColumn Binding="{Binding OSVersion}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="OS Version" Width="Auto" /> 
       </sdk:DataGrid.Columns> 

      </sdk:DataGrid> 
      <ListBox Grid.Row="2" ItemsSource="{Binding Data}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding DeviceId}"></TextBlock> 
          <Button Content="Select"> 
           <i:Interaction.Triggers> 
            <i:EventTrigger EventName="Click"> 
             <i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" /> 
            </i:EventTrigger> 
           </i:Interaction.Triggers> 
          </Button> 
         </StackPanel>       
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </Grid> 
+0

कोई नहीं जानता ..? – katit

+0

बटन की कमांड प्रॉपर्टी का उपयोग करने के बजाय आप इवेंट ट्रिगर का उपयोग क्यों कर रहे हैं? – Jehof

+0

@Jehof कमांड का उपयोग एक ही समस्या प्रस्तुत करता है। मैं पूरे आवेदन – katit

उत्तर

18

मुझे DataGrid के अंदर बहुत यकीन है, आपको अभी भी DataContextProxy की आवश्यकता है ताकि बाइंडिंग काम कर सकें। ElementName बाध्यकारी काम नहीं करता है (हाँ, यह काम कर रहा है ListBox टेम्पलेट्स के लिए, लेकिन नहीं DataGrid, इस वजह से DataGridTemplateColumn दृश्य पेड़ में नहीं है), सिल्वरलाइट 4 में भी

अद्यतन

में DataGrid में सिल्वरलाइट 5, DataContextProxy की आवश्यकता नहीं है क्योंकि पूर्वजों के बाध्यकारी के समर्थन के लिए धन्यवाद।

उदाहरण

<Button Command="{Binding DataContext.CancelCommand, RelativeSource={RelativeSource AncestorType=sdk:DataGrid}}" /> 
+0

डिफ़ॉल्ट RelativeSourceMode मूल्य प्लेटफ़ॉर्म-विशिष्ट है के लिए काम करता है, ताकि आप भी इसे स्थापित करना चाहिए, जैसे <बटन कमान = "{DataContext.CancelCommand बाइंडिंग, RelativeSource = {RelativeSource AncestorType = एसडीके: डेटा ग्रिड, मोड = FindAncestor}}" /> –

2

मुझे लगता है कि समस्या इस लाइन अपने XAML में

<i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" /> 

कारण है है कोई तत्व नाम नियंत्रण (उर्फ के साथ परिभाषित है एक्स:। नाम = "नियंत्रण")।

यदि आदेश DataContext कि LayoutRoot के लिए बाध्य है पर परिभाषित किया गया है ElementName = LayoutRoot को ElementName = नियंत्रण बदलना चाहिए।

मुझे नहीं पता कि यह ListBox में क्यों काम करता है।

+0

मेरे पास x: नाम = मेरे उपयोगकर्ता नियंत्रण पर नियंत्रण है। और यह ListBox – katit

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