2010-07-27 17 views
9

Tengo un problema con un kit de herramientas wpf DataGrid.wpf establece la clasificación mediante programación, por lo que el encabezado se alterna según ordenan

Tengo una ItemsSource con tres columnas:

FirstName

Apellido

Dirección

En el C# código subyacente me puse la dirección de ordenación y qué columna para ordenar así:

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

Ther No hay problema en la clasificación real, pero sí en el estilo visual de los encabezados. Si el usuario ordena una columna haciendo clic en el encabezado, el estilo visual cambia, pero el estilo visual no indica que la descripción de la ordenación de la columna se establece mediante programación.

¿Por qué es esto y cómo puedo alternar el encabezado para que se muestre como ordenado?

Respuesta

12

No lo he intentado antes, pero creo que podría establecer la propiedad SortDirection de la columna.

  int columnIndex = 0; 
      this.dataGrid1.ColumnFromDisplayIndex(columnIndex).SortDirection = 
       ListSortDirection.Descending; 
+0

Lamentablemente me sale este error: El DisplayIndex dada está fuera de rango. – Cinaird

+0

Ok, estaba un poco descuidado y funciona muy bien! Gracias – Cinaird

1

A continuación la muestra le permitirá ordenar la cuadrícula de datos mediante los cuadros combinados, así como hacer clic directamente en la cuadrícula de datos.

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> 

Código atrás:

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

Lamentablemente, la dosis no me ayudó a ordenar la lista en la ventana cargada, y ese es mi problema – Cinaird

+0

Simplemente tome el código en OnSort y conviértalo en un método que toma la columna para ordenar y ordenar la dirección. –

Cuestiones relacionadas