2012-08-16 55 views
1

有人能够提供一些指导这个问题:WPF DataGrid排序 - 数据可视化排序。底层数据不排序

我有一个DataGrid绑定到一个DataTable。

相关XAML &代码:

<DataGrid Name="dataGrid1" IsReadOnly="True" ItemsSource="{Binding}" 
<DataGrid.Columns> 
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" /> 
<DataGridTextColumn Header="Path" Binding="{Binding Path=Path}" /> 
</DataGrid.Columns> 


dataGrid1.DataContext = gridData.dt; // this is a DataTable with 3 columns. 

第三dT柱未在网格上显示。它被用作id。

数据表在第一列进行排序并显示内容。 用户可以通过点击它们在名称或路径列/标题上进行排序,并且视觉排序显示正常/显示正常。问题是,当我通过选择特定行来检查网格的数据时,DataTable的数据仍未排序。

我的问题是,在用户对某列进行排序时更新网格底层数据的最佳方法是什么? (这需要在适当的列排序数据表)

这是我观察到:

  1. 添加Click事件处理程序上DataGridColumnHeader不会触发事件。 我观察到columnHeader.SortDirection(发件人中)的值是CURRENT值,不是目标值。它是正确的说,给定列 排序顺序经历以下几个阶段: 空 - >升 降 - >升 上升到下降

I.E.通过了解当前状态,下一个状态是可确定的。

  1. 我可以在DataGridColumnHeader的SortDirection属性中寻找升序/降序/ null的触发器,但然后呢?我可以对此执行代码吗? 如果是这样,你能告诉我一个代码片段。

我有过类似的帖子了,并试图执行以下操作:

  • 通过我的DataGrid绑定到一个与CollectionViewSource实验。作为一个实验,我捕获了列标题单击事件并强制列上的排序顺序。这没有奏效。 (我的实现可能是错误的吗?)

  • 我将SortedMemberPath =“xx”添加到我的XAML中以指定DataGridTextColumn条目。

任何帮助极大的赞赏。

回答

1

使用DataGrid.Sorting事件:

public class DataGrid : MultiSelector 
{ 
    ... 

    // 
    // Summary: 
    //  Occurs when a column is being sorted. 
    public event DataGridSortingEventHandler Sorting; 

    ... 
} 

在事件处理程序,使用即列属性来找出哪些列是被用来对数据进行排序:

void dataGrid1_Sorting(object sender, DataGridSortingEventArgs e) 
{ 
    e.Column ... // TODO 
} 
+0

操作并不比DataGridColumnHeader Click事件不同。 I.E. SortDirection是BEFORE值。 – 2012-08-17 20:24:08

+0

我假设排序方向遵循上面指出的模式,并相应地编码。我添加了一个字典,将第一列(名称)映射到我的Id(第三个隐藏列)并相应地重新排序。也许不是最好的方法,但它工作正常。 – 2012-08-18 18:22:04