Команда привязки с использованием DataGridTemplateColumn - PullRequest
0 голосов
/ 11 марта 2019

Я хотел бы привязать команду ("EditOrCreateStudentCommand") к кнопке в DataGridTemplateColumn. DataContext в этом случае является StudentViewModel. Это определено в таблице.

В шаблоне данных я не могу выполнить команду (ничего не происходит). Вне шаблона я могу выполнить команду без проблем. В чем может быть причина?

<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, но ни один из них не решил эту проблему.

1 Ответ

1 голос
/ 11 марта 2019

Основной причиной вашей проблемы является то, что шаблон DataGrid содержит Grid.Поэтому, когда вы установите относительный источник, вы получите неверную сетку.Из визуального дерева в визуальной студии:

enter image description here

Возможное решение вашей проблемы - добавить имя в сетку и сослаться на него по 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>
...