wpf устанавливает сортировку программно, так что заголовок переключается как отсортированный - PullRequest
9 голосов
/ 27 июля 2010

У меня проблема с инструментарием wpf DataGrid.

У меня есть ItemsSource с тремя столбцами:

1007 * FirstName *

LastName

Адрес

В коде C # я задаю направление сортировки и столбец для сортировки следующим образом:

ICollectionView view = CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription("LastName", ListSortDirection.Ascending));
view.Refresh();

В реальной сортировке проблем нет, но в визуальном стиле заголовков. Если пользователь сортирует столбец, щелкая заголовок, визуальный стиль изменяется, но визуальный стиль не означает, что описание сортировки столбца задано программно.

Почему это так, и как я могу переключить заголовок, чтобы он отображался как отсортированный?

Ответы [ 3 ]

13 голосов
/ 27 июля 2010

Я не пробовал раньше, но я думаю, вы могли бы установить свойство SortDirection для столбца.

            int columnIndex = 0;
            this.dataGrid1.ColumnFromDisplayIndex(columnIndex).SortDirection = 
                ListSortDirection.Descending;
1 голос
/ 28 июля 2010

Приведенный ниже пример позволит вам отсортировать сетку данных с помощью комбинированных списков, а также щелкнуть непосредственно по сетке данных.

XAML:

<Window x:Class="DataGridDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=System"
    Height="300" Width="300">

    <Window.Resources>
        <ObjectDataProvider MethodName="GetValues" 
            ObjectType="{x:Type System:Enum}" 
            x:Key="SortDirections">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="ComponentModel:ListSortDirection" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>

    <StackPanel>
        <ComboBox 
            Name="_columnsComboBox"
            ItemsSource="{Binding Path=Columns, ElementName=_dataGrid}" 
            DisplayMemberPath="Header"
            SelectionChanged="OnSort" />
        <ComboBox 
            Name="_sortDirectionsComboBox"
            ItemsSource="{Binding Source={StaticResource SortDirections}}" 
            SelectionChanged="OnSort" />
        <Controls:DataGrid 
            Name="_dataGrid"
            ItemsSource="{Binding Path=PeopleData}" />

    </StackPanel>
</Window>

Код:

using System;
using System.ComponentModel;
using System.Data;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using Microsoft.Windows.Controls;

namespace DataGridDemo
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            PeopleData = new DataTable();
            PeopleData.Columns.Add(new DataColumn("Name", typeof(string)));
            PeopleData.Columns.Add(new DataColumn("Age", typeof(int)));

            var row = PeopleData.NewRow();
            row["Name"] = "Sara";
            row["Age"] = 25;
            PeopleData.Rows.Add(row);

            row = PeopleData.NewRow();
            row["Name"] = "Bob";
            row["Age"] = 37;
            PeopleData.Rows.Add(row);

            row = PeopleData.NewRow();
            row["Name"] = "Joe";
            row["Age"] = 10;
            PeopleData.Rows.Add(row);

            DataContext = this;
        }

        public DataTable PeopleData { get; private set;}

        private void OnSort(object sender, SelectionChangedEventArgs e)
        {
            if (_sortDirectionsComboBox.SelectedIndex == -1 || _columnsComboBox.SelectedIndex == -1)
            {
                return;
            }

            foreach (DataGridColumn dataColumn in _dataGrid.Columns)
            {
                dataColumn.SortDirection = null;
            }

            ListSortDirection sortDescription = (ListSortDirection)(_sortDirectionsComboBox.SelectedItem);
            DataGridColumn selectedDataColumn = _columnsComboBox.SelectedItem as DataGridColumn;
            selectedDataColumn.SortDirection = sortDescription;

            ICollectionView view = CollectionViewSource.GetDefaultView(_dataGrid.ItemsSource);
            view.SortDescriptions.Clear();
            view.SortDescriptions.Add(new SortDescription(selectedDataColumn.Header as string, sortDescription));
            view.Refresh();
        }
    }
}
0 голосов
/ 01 февраля 2019

Если вы хотите синхронизировать эффективную сортировку с визуальным стилем в столбце, это должно помочь:

  ( (INotifyCollectionChanged)Items.SortDescriptions ).CollectionChanged += new NotifyCollectionChangedEventHandler( OnItemsSortDescriptionsChanged );


 private void OnItemsSortDescriptionsChanged( object sender, NotifyCollectionChangedEventArgs e )
    {
        //Synchronize effective sorting in the grid and Visual style on columns
        if ( Items != null )
        {
            foreach ( DataGridColumn column in Columns )
            {
                column.SortDirection = null;

                foreach ( SortDescription sd in Items.SortDescriptions )
                {
                    if ( column.SortMemberPath == sd.PropertyName )
                    {
                        column.SortDirection = sd.Direction;
                        break;
                    }
                }
            }
        }
    }
...