2011-09-28 100 views
13

我有查看(包括XAML)附加到我的ViewModel的命令。当DataGrid的行点击Button时,我需要调用命令。我正在使用这种行为(常规指挥有同样的问题)。当我点击DataGrid上的按钮 - 我的命令不会被解雇。DataGridTemplateColumn中的绑定命令

为了说明问题 - 我将ListBox放在与EXACT相同的绑定东西的底部 - 是的,命令的作品。所以,这件事情与数据网格/ 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

为什么使用EventTrigger代替使用按钮的Command属性? – Jehof

+0

@Jehof使用命令会出现同样的问题。我在整个应用程序中使用事件触发器来保持一致性 – katit

回答

18

我很确定在DataGrid里面,你仍然需要DataContextProxy来使绑定工作。该绑定的ElementName不工作(是的,它正在为ListBox模板,但不DataGrid,这是因为DataGridTemplateColumn是不是在视觉树),即使在Silverlight 4

UPDATE

在由于祖先绑定的支持,在DataGrid中不需要Silverlight 5,DataContextProxy

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

默认的RelativeSourceMode值是特定于平台的,所以你也应该设置它,比如

2

我认为这个问题是此行

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

原因在你的XAML是没有用的名字控制(又名定义元素x:名称=“控制” )。

应更改的ElementName =控制的ElementName = LayoutRoot如果该命令是在绑定到LayoutRoot DataContext的定义。

我不知道为什么在列表框中工作。

+0

我有我的用户控件上的x:Name = Control。它适用于列表框 – katit