WPF DataGrid自定义排序:重新排序ItemsSource中的项目

时间:2012-04-20 10:23:23

标签: wpf sorting datagrid datatable dataview

我的自定义网格继承自DataGrid(来自WPFToolkit),其中包含大约10000个项目。内置排序非常慢。因此,我编写了一个单独的类,为每列保留了所有DataRowView项的运行类型(这是有效的,因为网格中的添加和删除非常少,如果有的话)。

网格有AutoGenerateColumns='True',并且绑定到DefaultView的{​​{1}}。

我覆盖DataTable以了解何时单击列标题并尝试使用我的DataRowView排序列表替换网格的OnSorting。以下是方法:

ItemsSource

问题在于我销毁了自动生成中存在的列。另外,我只剩下与 private void RefreshItems() { if (_updating || _multiIndexer.Count == 0) return; try { _updating = true; this.AutoGenerateColumns = false; // replace the itemssource with my maintained and sorted list of // DataRowView items this.ItemsSource = _multiIndexer.ToList(); } finally { //this.AutoGenerateColumns = true; _updating = false; } } 属性相匹配的列。

我认为最好的方法是从DataRowView的排序列表中创建DataView并将其传递给DataRowView,但我还没有取得任何成功。

如何在不破坏自动生成的列的情况下将新的行列表传递给ItemsSource或Items?手动生成我的所有列都不是一种选择。

干杯, 肖恩

2 个答案:

答案 0 :(得分:0)

我不知道如何摆脱重新创建列。我遇到了类似的问题,通常我正在使用ICollectionView和DeferRefresh。因为您不必在实际的模型对象中执行此操作。但我不确定它是否适用于DataViews以及与List一样好。

答案 1 :(得分:0)

你是什么意思"它非常慢"?

如果我采用数据网格并将数据表与50000row和20列绑定到它。对我来说似乎很快

视图模型

public class Viewmodel
{
    public DataTable MyData { get; set; }

    public Viewmodel()
    {
        this.MyData = new DataTable();

        for (int i = 0; i < 20; i++)
        {
            this.MyData.Columns.Add("Col" + i);
        }

        for (int i = 0; i < 50000; i++)
        {
            var row = MyData.NewRow();
            for (int j = 0; j < 20; j++)
            {

                row["Col" + j] = string.Format("{0} Row, Col {1}", i, j);
            }
            this.MyData.Rows.Add(row);

        }
    }
}   

窗口

    <DataGrid ItemsSource="{Binding MyData}" AutoGenerateColumns="True">

    </DataGrid>

编辑:其.net4.0