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的赋值也是只有在单元格的值发生变化的时候才会触发界面更新的
后面尝试每次赋值的时候,每个单元格都赋跟上次一样的值,貌似界面没有刷新,也一点也不卡。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?