Как привязать dataTrigger к шаблону DataGridColumnHeader - PullRequest
1 голос
/ 09 мая 2019

Я работаю над 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.

Возможно ли это сделать?И как мне добиться этой функции?

Спасибо за помощь!

...