DataGridTemplateColumn 中的绑定命令

Binding Command withing a DataGridTemplateColumn

我想将命令 ("EditOrCreateStudentCommand") 绑定到 DataGridTemplateColumn 中的按钮。 本例中的 DataContext 是 StudentViewModel。这是在网格中定义的。

在 DataTemplate 中我无法执行命令(没有任何反应)。 在模板之外,我可以毫无问题地执行命令。可能是什么原因?

<Grid DataContext="{Binding StudentViewModel}">
   <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Students}">
      <DataGrid.Columns>
         <DataGridTextColumn Binding="{Binding Name}" IsReadOnly="True" Width="*" />
         <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                  <Button Command="{Binding Path=DataContext.EditOrCreateStudentCommand, RelativeSource={RelativeSource AncestorType=Grid}}"/>
               </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
         </DataGridTemplateColumn>
      </DataGrid.Columns>
   </DataGrid>
</Grid>

我已经在 Whosebug 上看过其他相同的问题,但是 none 解决了这个问题。

问题的根本原因是 DataGrid 模板包含 Grid。这就是为什么当你设置相对源时,你会得到不正确的网格。从 visual studio 中的可视树视图:

您的问题的一个可能解决方案是将名称添加到网格并通过绑定中的 ElementName 引用它:

<Grid x:Name="StudentGrid" DataContext="{Binding StudentViewModel}">
   <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Students}">
      <DataGrid.Columns>
         <DataGridTextColumn Binding="{Binding Name}" IsReadOnly="True" Width="*" />
         <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                  <Button Command="{Binding Path=DataContext.EditOrCreateStudentCommand, ElementName=StudentGrid}"/>
               </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
         </DataGridTemplateColumn>
      </DataGrid.Columns>
   </DataGrid>
</Grid>