我的自定义网格继承自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?手动生成我的所有列都不是一种选择。
干杯, 肖恩
答案 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