对DataGrid进行排序

时间:2015-03-30 11:09:01

标签: c# wpf

当我点击列标题时,我的DataGrid中的行顺序不会改变。我已经实现了一个自定义排序器,这是我的Compare-Function的原型,它被成功调用:

    public int Compare(object x, object y)
    {
        var rowView1 = x as DataRowView;
        var rowView2 = y as DataRowView;
        var row1 = rowView1.Row;
        var row2 = rowView2.Row;
        var row1Id = Convert.ToInt32(row1[0]);
        var row2Id = Convert.ToInt32(row2[0]);

        if (SortDirection == ListSortDirection.Ascending)
        {
            return row1Id.CompareTo(row2Id);
        }
        else
        {
            return row2Id.CompareTo(row1Id);
        }
    }

上面的比较函数似乎按照建议工作,它只是比较Ids并且在调试模式下,我看到比较导致有效的返回(+1或-1)。 Hower,数据网格中元素的顺序不会改变。我在这里错过了什么?我已经google了很长时间以至于我已经接近需要眼镜了......感谢您的帮助!

编辑:我网格的xaml

<DataGrid result:CustomSortBehaviour.AllowCustomSort="True" 
          Name="ResultDataGrid"
          IsReadOnly="True"
          ItemsSource="{Binding ResultDataTable}">
</DataGrid>

3 个答案:

答案 0 :(得分:1)

您实际需要设置的属性为CanUserSortColumns

因此将其设置为true,然后如果不起作用,请执行此操作。

<DataGrid Sorting="OnDataGridSort"
          CanUserSortColumns="True" 
          Name="ResultDataGrid"
          IsReadOnly="True"
          ItemsSource="{Binding ResultDataTable}">
</DataGrid>

然后你需要给ListcollectionView一个比较器的实例。

void OnDataGridSort(object sender, System.Windows.Controls.DataGridSortingEventArgs e)
{
    DataGrid dg = sender as DataGrid;
    ListCollectionView lcv = (ListCollectionView)CollectionViewSource.GetDefaultView(dg.ItemsSource);
    lcv.CustomSort = [Your IComparer instance here];
    e.Handled;
}

答案 1 :(得分:0)

您是否设置了DataGrid.AllowSorting属性?

答案 2 :(得分:0)

将此添加到您的代码中

  

allowsorting =&#34;真&#34;

你可以使用它。

<DataGrid  allowsorting="true" result:CustomSortBehaviour.AllowCustomSort="True" Name="ResultDataGrid" IsReadOnly="True" ItemsSource="{Binding ResultDataTable}">
    </DataGrid>