【发布时间】:2015-09-03 10:02:27
【问题描述】:
我正在使用大约 400-500 行的 Datagrid,而且速度非常慢。我正在使用 .NET 4.5 并尝试使用该属性
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
但没有效果。有人可以帮我解释一下为什么这个属性不适合我吗?
我的数据网格 xaml 是
<DataGrid VirtualizingPanel.IsVirtualizingWhenGrouping="True" VirtualizingPanel.VirtualizationMode="Recycling" Name="DetailsDlg" Grid.Column="1" Grid.Row="0" MinWidth="300" MinHeight="500" IsReadOnly="True" CanUserSortColumns="False" CanUserDeleteRows="False" SelectionMode="Single" ItemsSource="{Binding UnitDataTable, Mode=OneWay}"/>
我已尝试删除 VirtualizingPanel.VirtualizationMode 但没有效果。是渲染需要时间而不是加载我的 DataTable
我的视图模型
private object _SelectedItem;
public object SelectedItem
{
get
{
return _SelectedItem;
}
set
{
if (value != _SelectedItem)
{
_SelectedItem = value;
OnPropertyChanged("SelectedItem");
UpdateDataTable(_SelectedItem);
}
}
}
private DataTable _UnitDataTable;
public DataTable UnitDataTable
{
get
{
return _UnitDataTable;
}
set
{
if (value != _UnitDataTable)
{
_UnitDataTable = value;
OnPropertyChanged("UnitDataTable");
}
}
}
private void UpdateDataTable(object SelectedObject)
{
unittable = new DataTable("Unit Table");
if (SelectedObject != null)
{
string temp = ORBATTool.SelectedUnit.ToString();
List<MUnit> tempUnitList = new List<MUnit>();
if (SelectedObject is UnitTree)
{
AddChildUnitsToList(SelectedObject as UnitTree, tempUnitList);
}
else if (SelectedObject is MUnit)
{
tempUnitList.Add(SelectedObject as MUnit);
}
List<string> resList = CreateResList(tempUnitList);
unittable.Columns.Add(iNet_Localization.Cultures.Resources.Callsign);
unittable.Columns.Add(iNet_Localization.Cultures.Resources.Size);
unittable.Columns.Add(iNet_Localization.Cultures.Resources.Strength);
unittable.Columns.Add(iNet_Localization.Cultures.Resources.Position);
foreach (string st in resList)
{
string colname = st.Replace("(", "|");
colname = colname.Replace(")", "|");
unittable.Columns.Add(colname);
}
int firstRes = 4;
int[] scoreArray = new int[resList.Count + firstRes];
foreach (MUnit unit in tempUnitList)
{
DataRow dr = unittable.NewRow();
dr[0] = unit.Callsign;
dr[1] = resourceSet.GetString(unit.Size,true);
dr[2] = unit.Strength;
dr[3] = unit.PositionInCurrentGSP;
int resindex = firstRes;
foreach (string res in resList)
{
string resstring = string.Empty;
foreach (var unitres in unit.Resources)
{
if (unitres.Value == res)
{
resstring = unitres.Key;
}
}
// Calculate Res 'Scores'
try
{
if (resstring != string.Empty)
{
int numVal = Convert.ToInt32(resstring);
scoreArray[resindex] = scoreArray[resindex] + numVal;
}
}
catch (FormatException e)
{
// ignore value?
}
dr[resindex++] = resstring;
}
unittable.Rows.Add(dr);
}
UnitDataTable = unittable;
}
}
【问题讨论】:
-
请向我们展示您的 Itemssource 中的模型对象
-
我已经用 ViewModel 更新了问题
-
你是如何获取数据表的。你检查了检索时间吗?
-
是的。我在 UpdateDataTable 中的数据很快就被提取了。需要时间的是 UnitDataTable 的渲染。