我想将排序命令绑定到 DataGridColumn.Header,如果它绑定到按钮,则该函数可以工作,但我想在数据网格的列标题中实现它。我使用 MVVMCross 作为模式,因此我应该使用 IMVXCommand 来触发该函数。
这是我在 WPF 中的 XAML 代码,如果单击“SortColumn”按钮,则不会发生任何情况。
<DataGridTemplateColumn Width="300" >
<DataGridTemplateColumn.Header>
<Button Content="SortColumn" Command="{Binding IMvxSortCommand}"/>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Names}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
谢谢。
阅读 Stackoverflow 上的一些讨论并尝试不同的方法。
DataGrid
的标题在内部排列有ItemsPresenter
,因此每个项目都会失去其父项目的DataContext
。
如果遇到此类麻烦,您应该始终查看 XAML 绑定失败。
下一步是使用 SnoopWPF 检查应用程序,您可以通过
ItemsPresenter
查看问题。
要解决此问题,您必须重置 DataContext 或调整绑定路径,例如
<DataGrid x:Name="theGrid">
<!-- Option 1 -->
<DataGridTemplateColumn Width="300" >
<DataGridTemplateColumn.Header>
<Button Content="SortColumn" Command="{Binding Element=theGrid, Path=DataContext.IMvxSortCommand}"/>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Names}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- Option 2 -->
<DataGridTemplateColumn Width="300" >
<DataGridTemplateColumn.Header>
<Button DataContext="{Binding theGrid.DataContext}" Content="SortColumn" Command="{Binding IMvxSortCommand}"/>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Names}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- Option 3 -->
<DataGridTemplateColumn Width="300" >
<DataGridTemplateColumn.Header>
<Grid DataContext="{Binding theGrid.DataContext}">
<Button Content="SortColumn" Command="{Binding IMvxSortCommand}"/>
</Grid>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Names}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid>