0

DataGrid(WPFToolkit から)を継承するカスタム グリッドがあり、そこには約 10000 のアイテムがあります。組み込みの並べ替えは非常に遅いです。そのDataRowViewため、各列のすべてのアイテムの実行中の並べ替えを保持する別のクラスを作成しました (これは、グリッドからの追加と削除が非常にまれであるためです)。

グリッドは、 のを持っておりAutoGenerateColumns='True'、それにバインドされてDefaultViewDataTableます。

をオーバーライドし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

列の再作成を取り除く方法がわかりません。私も同様の問題を抱えており、通常は ICollectionView と DeferRefresh を使用しています。実際のモデル オブジェクトでそれを行う必要がないためです。しかし、リストと同様に DataViews でもうまく機能するかどうかはわかりません。

于 2012-04-20T10:32:47.723 に答える
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 に答える