Я работаю над DataGrid с пользовательской реализацией сортировки, и colomnHeader должен отображать направление сортировки и порядок сортировки.
Я использую шаблон MVVM.
В моемviewModel, у меня есть ObservableCollection моих сортировщиков.У каждого сортировщика есть тег, который соответствует SortMemberPath столбца.
Моя цель - привязать columnHeader к соответствующему сортировщику с правильным тегом, чтобы получить SortDirection (он также есть в columnHeader), но также SortOrder, который позволяет мне отображать индекс сортировщика в заголовке.После этого я хотел бы добавить аналогичную функцию для фильтров (с другой ObservableCollection of Filters)
Для этого я использую пользовательский Thumb, который я установил в заголовке, со следующим DependencyProperty:
- ListSortDirection?CustomSortDirection
- int SortOrder
- bool 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-->
Я бы сделал DataTrigger с конвертером, предоставив ему коллекцию Sorters и SortMemberPath в converterParameter.
Возможно ли это сделать?И как мне добиться этой функции?
Спасибо за помощь!