我正在处理具有自定义排序实现的 DataGrid,并且 colomnHeader 应该显示排序方向和排序顺序。
我正在使用 MVVM 模式。
在我的 viewModel 中,我有一个分拣机的 ObservableCollection。每个排序器都有一个标签,它对应于列的 SortMemberPath。
我的目标是使用正确的标签将 columnHeader 绑定到相应的排序器,以获得 SortDirection(columnHeader 也有),还有 SortOrder,它允许我在标题中显示排序器的索引。之后,我想为过滤器添加一个类似的功能(使用另一个 ObservableCollection 过滤器)
为此,我使用了在标题中设置的自定义 Thumb,并带有以下 DependencyProperty :
- 列表排序方向?自定义排序方向
- 整数排序顺序
- 布尔 IsFiltered
但是通过使用这种方式,我需要在修改排序列表时更新拇指。
<!--Custom Column Header template to show extra elements in the header-->
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<!--Let's keep the top section grid to contain the DataGridHeaderBorder, and left+right thumbs.-->
<Grid x:Name="fullHeader" Background="{StaticResource Brush.Background}" >
<Grid Margin="0">
<Grid.ColumnDefinitions>
<!--Padding-->
<ColumnDefinition Width="5" />
<!--For ContentPresenter-->
<ColumnDefinition Width="*" />
<!--Padding-->
<ColumnDefinition Width="3" />
<!--For filter symbol-->
<ColumnDefinition Width="10" />
<!--Padding-->
<ColumnDefinition Width="3" />
<!--For sort order indicator-->
<ColumnDefinition Width="12" />
<!--Padding-->
<ColumnDefinition Width="5" />
</Grid.ColumnDefinitions>
<!--Hidden rectangle is placed to be shown when mouse hovers on the column (to highlight the column.)-->
<Rectangle x:Name="HoverRectangle"
Stretch="Fill"
Grid.ColumnSpan="7"
Fill="{StaticResource Brush.BackgroundMouseOver}"
Opacity="0"
StrokeThickness="0" />
<!--Content of the header.-->
<ContentPresenter Grid.Column="1"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
Cursor="{TemplateBinding Cursor}" />
<!--Drop down filter button.-->
<!--Filter symbol-->
<Path x:Name="FilterSymbol"
Grid.Column="3"
Data="M 0,0 L 1,1 1,3 2,3 2,1 3,0 Z"
Stretch="UniformToFill"
Stroke="{TemplateBinding Foreground}"
Fill="{TemplateBinding Foreground}"
Margin="0,5" />
<!--Sort order arrow icon.-->
<Grid Grid.Column="5">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Path x:Name="SortArrow"
Grid.Row="0"
HorizontalAlignment="Center" VerticalAlignment="Center"
Width="8"
RenderTransformOrigin=".5,.5"
Visibility="Visible"
Fill="{TemplateBinding Foreground}"
Stretch="Uniform"
Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z" />
<TextBlock x:Name="SortOrder"
Text="{Binding ElementName=SorterThumb, Path=SortOrder}"
Grid.Row="1"
FontSize="8"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Grid>
</Grid>
<Thumb x:Name="PART_LeftHeaderGripper"
HorizontalAlignment="Left"
Style="{StaticResource ColumnHeaderGripperStyle}" />
<Thumb x:Name="PART_RightHeaderGripper"
HorizontalAlignment="Right"
Style="{StaticResource ColumnHeaderGripperStyle}" />
<local:SorterThumb x:Name="SorterThumb" Width="0" Height="0"/>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Value="{x:Null}">
<!-- Trying to get the sorter-->
<!--Binding="{Binding DataContext,
RelativeSource={RelativeSource AncestorType=DataGrid},
Converter={StaticResource SortDirectionConv},
ConverterParameter={RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type DataGridColumn},
Path=PlacementTarget.Column.SortMemberPath}}" >-->
<DataTrigger.Binding>
<Binding ElementName="SorterThumb"
Path="CustomSortDirection"/>
</DataTrigger.Binding>
<Setter TargetName="SortArrow" Property="Visibility" Value="Hidden" />
<Setter TargetName="SortOrder" Property="Visibility" Value="Hidden" />
</DataTrigger>
<DataTrigger Value="Descending">
<DataTrigger.Binding>
<Binding ElementName="SorterThumb"
Path="CustomSortDirection"/>
</DataTrigger.Binding>
<Setter TargetName="SortArrow" Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="180" />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Value="False">
<DataTrigger.Binding>
<Binding ElementName="SorterThumb"
Path="IsFiltered"/>
</DataTrigger.Binding>
<Setter TargetName="FilterSymbol" Property="Visibility" Value="Hidden" />
</DataTrigger>
<Trigger Property='IsMouseOver' SourceName="fullHeader" Value='True'>
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="00:00:00" Duration="00:00:00.20000"
Storyboard.TargetName="HoverRectangle"
Storyboard.TargetProperty="(UIElement.Opacity)"
To='1.0' />
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation BeginTime="00:00:00" Duration="00:00:00.20000"
Storyboard.TargetName="HoverRectangle"
Storyboard.TargetProperty="(UIElement.Opacity)"
To='0' />
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!--End of custom DataGridColumnHeader template-->
我会通过给它排序器集合和转换器参数中的 SortMemberPath 来制作一个带有转换器的 DataTrigger。
有可能吗?我怎样才能实现这个功能?
谢谢您的帮助 !