我正在尝试实现类似 Excel 的列过滤和排序。为此,我使用了 DataTemplate 来定义列标题。
<DataGrid x:Name="dataGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" CanUserSortColumns="False">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="23"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button x:Name="ExcelFilterButton" Tag="{Binding}" Click="ExcelFilterButton_Click" Margin="0,0,0,0" BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" Focusable="False" Grid.Column="0">
<Image Source="Resources\NoSortNoFilter.png" Width="19" Height="19" />
</Button>
<TextBlock Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" />
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Resources>
</DataGrid>
结果很好。
我尝试使用 VisualTreeHelper 从列标题中查找图像,但 Header 属性是一个字符串。我也尝试过使用 HeaderStyle 和 HeaderTemplate 属性,但无济于事。
使用名为 Snoop 的 WPF Spy 程序,我可以在其中看到图像,但仍然无法弄清楚如何在代码中访问它。我需要在代码中访问它的原因是根据该列是否已排序和/或过滤来更改图像。(这可以在 XAML 中完成吗?)