0

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

网格具有AutoGenerateColumns='True'并绑定到DefaultViewa 的DataTable

我覆盖OnSorting以知道何时单击列标题并尝试ItemsSource用我的 DataRowView 排序列表替换网格。下面是方法:

    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但我还没有取得任何成功。

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

干杯,肖恩

4

2 回答 2

0

你说的“它很慢”是什么意思?

如果我采用数据网格并将具有 50000 行和 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

于 2012-04-20T12:39:08.503 回答
0

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

于 2012-04-20T10:32:47.723 回答