DataGridTemplateColumn中的绑定命令

问题描述 投票:0回答:1

我想将命令(“EditOrCreateStudentCommand”)绑定到DataGridTemplateColumn中的按钮。在这种情况下,DataContext是StudentViewModel。这是在Grid中定义的。

在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>

我已经在stackoverflow上查看了其他相同的问题,但没有一个解决了这个问题。

c# wpf xaml mvvm mvvm-light
1个回答
1
投票

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

enter image description here

您的问题的一个可能的解决方案是将Name添加到网格并在绑定中通过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>
© www.soinside.com 2019 - 2024. All rights reserved.