WPF的DataGrid绑定DataTable调研小记

发布时间 2024-01-11 13:13:48作者: wzwyc

公司有个项目,界面很卡,同事怀疑是DataTable刷新引起的,我写了一个小Demo测试一下这块的性能。

测试的结果

DataTalbe的绑定非常的耗时

我的前台代码:

<DataGrid
    Grid.Row="1"
    AutoGenerateColumns="True"
    BorderBrush="LightGray"
    ItemsSource="{Binding Items}"
    MaxColumnWidth="350"
    ScrollViewer.CanContentScroll="False"
    SelectedItem="{Binding SelectedItem}"
    Style="{StaticResource DataGridStyle1}">
</DataGrid>

后台对应的属性:

private DataTable _table;

public DataView? Items { get; set; }
public object SelectedItem { get; set; }

赋值操作:

private void OnBindingTable()
{
    Items = _table.DefaultView;
}

_table是200行,50列,执行OnBindingTable界面会卡好几秒。

DispatcherTimer定时器在毫秒的精度上是不可靠的。

为了模拟参数实时刷新,我开始用DispatcherTimer定时器来刷新,一开始用10ms的间隔,发现帧数达不到每秒100帧,大概40帧左右。后来改成100ms的间隔,也只有每秒5帧左右。改成1000ms,基本上还算是准的。

定时器的执行函数:

private void _timer_Tick(object? sender, EventArgs e)
{
    Index++;
    Time = _sw.ElapsedMilliseconds;
    if (Time > 0)
    {
        FrameCount = Index * 1000.0 / Time;
    }

#if true
    var idList = Enumerable.Range(0, RowCount * ColumnCount).ToList();
    Random random = new Random();
    for (int i = 0; i < ParamCount; i++)
    {
        var id = random.Next(idList.Count);
        var index = idList[id];

        var rowId = index / ColumnCount;
        var colId = index % ColumnCount;

        var row = _table.Rows[rowId];

        row[colId] = random.Next(1000).ToString();
        idList.RemoveAt(id);
    }
#endif
}

整体界面基本上不卡。