【问题标题】:Binding Command withing a DataGridTemplateColumnDataGridTemplateColumn 中的绑定命令
【发布时间】:2019-03-11 09:02:32
【问题描述】:

我想将命令(“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】:

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

解决您的问题的一种可能方法是将 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>

【讨论】:

  • 感谢您的详细解答。没想到!
猜你喜欢
  • 2014-11-15
  • 2011-09-28
  • 2011-11-27
  • 1970-01-01
  • 2013-07-02
  • 2017-01-16
  • 1970-01-01
  • 2011-04-06
  • 2014-04-14
相关资源
最近更新 更多