C# 如何将dataTrigger绑定到DataGridColumnHeader模板

C# 如何将dataTrigger绑定到DataGridColumnHeader模板,c#,wpf,xaml,datagridcolumnheader,C#,Wpf,Xaml,Datagridcolumnheader,我正在使用一个带有自定义排序实现的DataGrid,ColumnHeader应该显示排序方向和排序顺序 我使用的是MVVM模式 在我的viewModel中,我有一个可观察的分类器集合。 每个分拣机都有一个标签,对应于列的SortMemberPath 我的目标是用正确的标签将columnHeader绑定到相应的分拣机,以获得SortDirection(columnHeader也有它),还包括SortOrder,它允许我在标题中显示分拣机的索引。 在那之后,我想为过滤器添加一个类似的特性(与其他Ob

我正在使用一个带有自定义排序实现的DataGrid,ColumnHeader应该显示排序方向和排序顺序

我使用的是MVVM模式

在我的viewModel中,我有一个可观察的分类器集合。 每个分拣机都有一个标签,对应于列的SortMemberPath

我的目标是用正确的标签将columnHeader绑定到相应的分拣机,以获得SortDirection(columnHeader也有它),还包括SortOrder,它允许我在标题中显示分拣机的索引。 在那之后,我想为过滤器添加一个类似的特性(与其他ObservableCollection过滤器一起)

为此,我使用了在标题中设置的自定义拇指,并具有以下DependencyProperty:

  • ListSortDirection?自定义方向
  • 内部排序器
  • 布尔被过滤掉了
但是通过使用这种方式,我需要在修改分拣机列表时更新拇指

<!--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,方法是在converterParameter中为它指定Sorters集合和SortMemberPath

有可能吗?我怎样才能实现这个功能呢

谢谢你的帮助