WPF的DataGrid绑定DataTable调研小记

公司有个项目,界面很卡,同事怀疑是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
}

整体界面基本上不卡。

貌似DataTable的赋值也是只有在单元格的值发生变化的时候才会触发界面更新的

后面尝试每次赋值的时候,每个单元格都赋跟上次一样的值,貌似界面没有刷新,也一点也不卡。

posted @   wzwyc  阅读(661)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示