在Sorting ListView中显示箭头

时间:2017-05-10 11:54:49

标签: c# wpf

我的ListView已经有了一个排序代码可以正常工作:

public void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
    {

        try
        {
            GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;
            ListSortDirection direction;

            if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
            {
                if (headerClicked != _lastHeaderClicked)
                {
                    direction = ListSortDirection.Descending;
                }
                else
                {
                    if (_lastDirection == ListSortDirection.Ascending)
                    {
                        direction = ListSortDirection.Descending;
                    }
                    else
                    {
                        direction = ListSortDirection.Ascending;
                    }
                }

                var propertyName = headerClicked.Column.GetValue(TextSearch.TextPathProperty) as string;
                Sort(propertyName, direction);

                _lastHeaderClicked = headerClicked;
                _lastDirection = direction;
            }


        catch
        {
            return;
        }


    }


    private void Sort(string sortBy, ListSortDirection direction)
    {
        ListViewAnlagen.Items.SortDescriptions.Clear();
        SortDescription sd = new SortDescription(sortBy, direction);
        ListViewAnlagen.Items.SortDescriptions.Add(sd);
        ListViewAnlagen.Items.Refresh();
    }

我的GridViewColumns的XAML:

 <ListView x:Name="ListViewAnlagen" ItemContainerStyle="{StaticResource TempContainerStyle}"  VerticalAlignment="Top" Height="571" Grid.RowSpan="2" Margin="0,53,0,0" AlternationCount="2" HorizontalAlignment="Left" Width="1314"  GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler" Unloaded="ListViewAnlagen_Unloaded" ContextMenuClosing="ListViewAnlagen_ContextMenuClosing" ItemsSource="{Binding Anlagen}" IsSynchronizedWithCurrentItem="True">
                        <ListView.View>
                            <GridView  ColumnHeaderContainerStyle="{DynamicResource CustomHeaderStyle}" xmlns:l="clr-namespace:FixedWidthColumnSample">
                                <GridView.Columns>
                                    <l:FixedWidthColumn FixedWidth="100"  TextSearch.TextPath="EQNr">
                                        <GridViewColumn.CellTemplate>
                                            <DataTemplate>
                                                <Border x:Name="border" BorderBrush="Gray" BorderThickness=".5"  Margin="-6,-3">
                                                    <TextBlock Name="txteqnr" Text="{Binding Path=EQNr}"  Margin="6,3" />
                                                </Border>
                                            </DataTemplate>
                                        </GridViewColumn.CellTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="EQ Nr."/>                                           
                                        </StackPanel>
                                    </l:FixedWidthColumn>

我的问题是如果我点击(可能是图像?),如何在标题中获得升序和降序箭头,ListView中有更多列标题(我只发布一个),所以如果我点击箭头就会消失另一个列标题......任何想法?

1 个答案:

答案 0 :(得分:1)

这很复杂,请看一个像cbr comic book reader

这样的工作样本

使用sort adorner类

public class SortAdorner : Adorner
{
    private readonly static Geometry _AscGeometry = Geometry.Parse("M 0,0 L 10,0 L 5,5 Z");

    private readonly static Geometry _DescGeometry = Geometry.Parse("M 0,5 L 10,5 L 5,0 Z");

    public ListSortDirection Direction { get; private set; }

    public SortAdorner(UIElement element, ListSortDirection dir) : base(element)
    {
        Direction = dir;
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        if (AdornedElement.RenderSize.Width < 20)
            return;

        drawingContext.PushTransform(
             new TranslateTransform( AdornedElement.RenderSize.Width - 15, (AdornedElement.RenderSize.Height - 5) / 2));

        drawingContext.DrawGeometry(Brushes.Black, null, Direction == ListSortDirection.Ascending ? _AscGeometry : _DescGeometry);

        drawingContext.Pop();
    }
}

用于ExtendedListView

private SortAdorner _CurAdorner = null;
private void ListViewHeader_Click(object sender, RoutedEventArgs e)