2013-04-17 135 views
3

我正在實施WPF數據網格中的分組。我想對分組項目進行排序。 例如,datagrid有四列(empno,name,dept,address)。我正在按部門專欄進行分組。 當我點擊部門的列標題我想排序分組的項目。WPF Datagrid組和排序

在這裏,我使用ListCollectionView將代碼中的項目分組在後面。

public ListCollectionView collection; 
collection = new ListCollectionView(obj.empData); 

collection.GroupDescriptions.Add(new PropertyGroupDescription("Country")); 
dgData.Items.SortDescriptions.Add 
      (new System.ComponentModel.SortDescription 
        ("Country" 
        ,System.ComponentModel.ListSortDirection.Descending 
        ) 
      ); 
dgData.Items.SortDescriptions.Add 
      (new System.ComponentModel.SortDescription 
        ("Contact" 
        , System.ComponentModel.ListSortDirection.Descending 
        ) 
     ); 
dgData.ItemsSource = collection; 

private void dgData_Sorting 
     (object sender, Microsoft.Windows.Controls.DataGridSortingEventArgs e) 
{ 
    if (e.Column.SortDirection.ToString() == "Ascending") 
    { 
     //dgData.Items.SortDescriptions.Clear(); 
     collection.Refresh(); 
     collection = new ListCollectionView(obj.empData); 
     collection.GroupDescriptions.Add(new PropertyGroupDescription("Country")); 
     dgData.Items.SortDescriptions.Add 
      (new System.ComponentModel.SortDescription 
        ("Country" 
        , System.ComponentModel.ListSortDirection.Descending 
       ) 
      ); 
     dgData.ItemsSource = collection; 
    } 
} 

更改排序順序後,它不反映在UI中。請讓我知道實現這一點的正確方法。

回答

2

你見過MSDN文章How to: Sort a GridView Column When a Header Is Clicked是指將樣品從ListView That Sorts Data Sample,而後者具有(Download sample)鏈接

有趣,但最終參考sample download是隻能通過.NET 3.0和3.5版本的MSDN文章,但不通過.NET 4.0和4.5的版本,儘管代碼片段是相同的。

也有上述MSDN樣品,經與樣本沼文章:

還有MSDN博客文章與可運行的Visual Studio項目(在WPF Toolkit上具有相似性):

+0

感謝sooooo有價值的鏈接 – Chubsdad

1

您可以使用此代碼(限制: 「聯繫」 排序時, 「國家」 的訂單將重置爲升序):

void dgData_Sorting(object sender, DataGridSortingEventArgs e) 
{ 
    // reset sortings 
    collection.SortDescriptions.Clear(); 

    // define column sort 
    e.Column.SortDirection = e.Column.SortDirection 
      == ListSortDirection.Ascending 
      ? ListSortDirection.Descending : ListSortDirection.Ascending; 

    // sort collection 
    collection.SortDescriptions.Add 
      (new SortDescription 
        (e.Column.SortMemberPath 
        , e.Column.SortDirection.GetValueOrDefault() 
        ) 
      ); 

    // mark event as handled otherwise the datagrid will "reset" your custom sorting 
    e.Handled = true; 
} 
+0

這非常接近。我的表格有更多列。因此,當我在「員工」這樣的第二個字段上排序時,那麼排序會發生在表中的所有條目上(跨多個國家/地區),而不是指定國家/地區的員工。有關如何做到這一點的任何想法? – Chubsdad

0

我發現打開Live Sorting會使第二個排序欄實際生效,例如:

collection.IsLiveSortingRequested = true; 
collection.LiveSortingProperties.Clear(); 
collection.LiveSortingProperties.Add("Contact");