数据网格渲染缓慢

本文关键字:缓慢 网格 数据网 数据 | 更新日期: 2023-09-27 18:10:56

我使用的是Datagrid,它有大约400-500行,而且很慢。我正在使用。net 4.5,并尝试使用属性

VirtualizingPanel.IsVirtualizingWhenGrouping="True"

但没有效果。有人能帮我解释一下为什么这个属性不适合我吗?

my datagrid xaml is

    <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,但没有效果。这是渲染需要时间,而不是加载我的数据表

我ViewModel

    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;
        }
    }

数据网格渲染缓慢

这几件事可以帮助你提高性能。

  • 如果你的数据网格中有大量的行和列,你应该使用自定义分页

  • 删除外部滚动查看器

    EnableColumnVirtualization = true
    EnableRowVirtualization = true
    ItemsSource="{Binding MyDataTable, IsAysnc=True}