2010-07-27 76 views
9

我有一個wpf工具包DataGrid的問題。wpf以編程方式設置排序,以便將頁眉切換爲排序

我有一個ItemsSource有三列:

名字

地址

在C#代碼隱藏我設置排序方向和列進行排序是這樣的:

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

Ther e在實際排序中沒有問題,但是在標題視覺樣式中。如果用戶通過單擊標題對列進行排序,則視覺樣式會更改,但視覺樣式並不表示列編排描述是以編程方式設置的。

這是爲什麼,我怎麼可以切換頭所以它會顯示爲排序?

回答

12

我還沒有嘗試過,但我認爲你可以設置列的SortDirection屬性。

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

可悲的是我得到這個錯誤: 給定的DisplayIndex超出範圍。 – Cinaird 2010-07-27 14:34:13

+0

好吧,我有點sl and,它效果很好!謝謝 – Cinaird 2010-07-28 07:23:24

1

下面的示例將讓您使用組合框對數據網格進行排序以及直接單擊數據網格。

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

可悲的是,它無法幫助我排序窗口加載,這是我的問題 – Cinaird 2010-07-28 06:36:15

+0

只需在OnSort中的代碼,並使其成爲一種方法,需要列進行排序和排序方向。 – 2010-07-28 12:49:14