【问题标题】:WPF GridView sorting when clicking column header单击列标题时的WPF GridView排序
【发布时间】:2020-05-25 00:32:55
【问题描述】:

我正在实现一个 GridView,它通过单击列标题进行排序。我正在寻找一种标准解决方案,但它对我不起作用。

我有一个标题“P”,而单元格的内容和标题都应该居中(对齐)。标头具有与绑定“照片”不同的标签“P”。

<GridViewColumn Width="30" Header="P">

    <GridViewColumn.HeaderContainerStyle>
        <Style TargetType="{x:Type GridViewColumnHeader}">
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
        </Style>
    </GridViewColumn.HeaderContainerStyle>

        <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Photo}" HorizontalAlignment="Center"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>

</GridViewColumn>

处理列单击的代码如下(来自 Mircosoft 站点)。

假设存在 DisplayMemberBinding

var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;

我没有,否则列标题和内容不居中。

否则将列的标签作为属性进行排序。

var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;

这也不起作用,因为我的标签是“P”而属性是“照片”。

还有什么想法吗?

internal void HandleOverviewColumnHeaderClicked(GridViewColumnHeader headerClicked)
{
    ListSortDirection direction;

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

            var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
            var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;

            Sort(sortBy, direction);

            if (direction == ListSortDirection.Ascending)
            {
                headerClicked.Column.HeaderTemplate = _window.Resources["HeaderTemplateArrowUp"] as DataTemplate;
            }
            else
            {
                headerClicked.Column.HeaderTemplate = _window.Resources["HeaderTemplateArrowDown"] as DataTemplate;
            }

            // Remove arrow from previously sorted header
            if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)
            {
                _lastHeaderClicked.Column.HeaderTemplate = null;
            }

            _lastHeaderClicked = headerClicked;
            _lastDirection = direction; 
        }
    }
}

【问题讨论】:

    标签: c# wpf sorting listview gridview


    【解决方案1】:
    <GridViewColumn DisplayMemberBinding="{Binding MyData}">
          <GridViewColumnHeader Content="MyHeader" Click="GridViewColumnHeader_Click" />
    </GridViewColumn>
    

            GridViewColumnHeader _lastHeaderClicked = null;
            ListSortDirection _lastDirection = ListSortDirection.Ascending;
    
            private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e)
            {            
                var headerClicked = e.OriginalSource as GridViewColumnHeader;
                ListSortDirection direction;
    
                if (headerClicked != null)
                {
                    if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
                    {
                        if (headerClicked != _lastHeaderClicked)
                        {
                            direction = ListSortDirection.Ascending;
                        }
                        else
                        {
                            if (_lastDirection == ListSortDirection.Ascending)
                            {
                                direction = ListSortDirection.Descending;
                            }
                            else
                            {
                                direction = ListSortDirection.Ascending;
                            }
                        }
    
                        var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
                        var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;
    
                        Sort(sortBy, direction);
    
                        if (direction == ListSortDirection.Ascending)
                        {
                            headerClicked.Column.HeaderTemplate =
                              Resources["HeaderTemplateArrowUp"] as DataTemplate;
                        }
                        else
                        {
                            headerClicked.Column.HeaderTemplate =
                              Resources["HeaderTemplateArrowDown"] as DataTemplate;
                        }
    
                        // Remove arrow from previously sorted header
                        if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)
                        {
                            _lastHeaderClicked.Column.HeaderTemplate = null;
                        }
    
                        _lastHeaderClicked = headerClicked;
                        _lastDirection = direction;
                    }
                }
            }
    
            private void Sort(string sortBy, ListSortDirection direction)
            {
                ICollectionView dataView =
                  CollectionViewSource.GetDefaultView(lv.ItemsSource);
    
                dataView.SortDescriptions.Clear();
                SortDescription sd = new SortDescription(sortBy, direction);
                dataView.SortDescriptions.Add(sd);
                dataView.Refresh();
            }
    

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多