2010-07-27 27 views
9

Ho un problema con un toolkit wpf DataGrid.wpf imposta l'ordinamento a livello di codice, in modo che l'intestazione sia commutata come ordinata

Ho un ItemsSource con tre colonne:

FirstName

Cognome

Indirizzo

In C# codebehind Ho impostato la direzione di ordinamento e la colonna per ordinare in questo modo:

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

Ther e non è un problema nell'ordinamento attuale ma c'è nello stile visivo delle intestazioni. Se l'utente ordina una colonna facendo clic sull'intestazione, lo stile di visualizzazione cambia, ma lo stile di visualizzazione non indica che la descrizione di ordinamento della colonna sia impostata a livello di programmazione.

Perché è questo e come posso attivare l'intestazione in modo che venga visualizzato come ordinato?

risposta

12

Non l'ho provato prima, ma penso che si possa impostare la proprietà SortDirection della colonna.

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

Purtroppo ottengo questo errore: Il dato DisplayIndex è fuori portata. – Cinaird

+0

Ok, ero un po 'sciatto e funziona benissimo! Grazie – Cinaird

1

Sotto l'esempio è possibile ordinare la griglia di dati utilizzando le caselle combinate e facendo clic direttamente sul datagrid.

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> 

codice dietro:

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

Purtroppo non mi aiuta a ordinare l'elenco sulla finestra caricata, e questo è il mio problema – Cinaird

+0

Basta prendere il codice in OnSort e trasformarlo in un metodo che richiede la colonna per ordinare e ordinare la direzione. –

Problemi correlati