开门见山的说

性能对比:

在Demo中,DataGrid与ListView默认开启虚拟化(可以理解为动态渲染,类似懒加载只渲染屏幕可以看见的地方)

DataGrid渲染10列50行随机字符280ms

ListView渲染10列50行随机字符80ms

场景选择:

ListView只生成需要展示的数据类型的控件,渲染相对DataGrid要快很多

DataGrid会生成编辑两种状态单元格(编辑与非编辑),如非必要不推荐使用(编辑单元格WPF硬伤/(ㄒoㄒ)/~~)

UI效果图:

Code:

XAML

<Window x:Class="WPFDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WPFDemo" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition />
</Grid.RowDefinitions>
<WrapPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<Button Margin="5,0" Width="80" Content="Next" Click="Button_Click"></Button>
<Label Content="DataGrid" Style="{x:Null}" VerticalAlignment="Center"></Label>
<Label Margin="5,0" Content="{Binding DgMs,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" x:Name="uiDgMs"></Label>
<Label Content="ms" Style="{x:Null}" VerticalAlignment="Center"></Label>
<Label Margin="5,0,0,0" Content="ListView" Style="{x:Null}" VerticalAlignment="Center"></Label>
<Label Margin="5,0" Content="{Binding LvMs,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" x:Name="uiLvMs"></Label>
<Label Content="ms" Style="{x:Null}" VerticalAlignment="Center"></Label>
</WrapPanel>
<TabControl Grid.Row="1">
<TabItem Header="DataGrid">
<DataGrid ItemsSource="{Binding DgList}" RowStyle="{x:Null}" AutoGenerateColumns="False" EnableColumnVirtualization="True" EnableRowVirtualization="True">
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<Setter Property="Height" Value="24" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="F1" Binding="{Binding F1}"></DataGridTextColumn>
<DataGridTextColumn Header="F2" Binding="{Binding F2}"></DataGridTextColumn>
<DataGridTextColumn Header="F3" Binding="{Binding F3}"></DataGridTextColumn>
<DataGridTextColumn Header="F4" Binding="{Binding F4}"></DataGridTextColumn>
<DataGridTextColumn Header="F5" Binding="{Binding F5}"></DataGridTextColumn>
<DataGridTextColumn Header="F6" Binding="{Binding F6}"></DataGridTextColumn>
<DataGridTextColumn Header="F7" Binding="{Binding F7}"></DataGridTextColumn>
<DataGridTextColumn Header="F8" Binding="{Binding F8}"></DataGridTextColumn>
<DataGridTextColumn Header="F9" Binding="{Binding F9}"></DataGridTextColumn>
<DataGridTextColumn Header="F10" Binding="{Binding F10}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</TabItem>
<TabItem Header="ListView">
<ListView ItemsSource="{Binding LvList}">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Height" Value="20" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="F1" DisplayMemberBinding="{Binding F1}"></GridViewColumn>
<GridViewColumn Header="F2" DisplayMemberBinding="{Binding F2}"></GridViewColumn>
<GridViewColumn Header="F3" DisplayMemberBinding="{Binding F3}"></GridViewColumn>
<GridViewColumn Header="F4" DisplayMemberBinding="{Binding F4}"></GridViewColumn>
<GridViewColumn Header="F5" DisplayMemberBinding="{Binding F5}"></GridViewColumn>
<GridViewColumn Header="F6" DisplayMemberBinding="{Binding F6}"></GridViewColumn>
<GridViewColumn Header="F7" DisplayMemberBinding="{Binding F7}"></GridViewColumn>
<GridViewColumn Header="F8" DisplayMemberBinding="{Binding F8}"></GridViewColumn>
<GridViewColumn Header="F9" DisplayMemberBinding="{Binding F9}"></GridViewColumn>
<GridViewColumn Header="F10" DisplayMemberBinding="{Binding F10}"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</TabItem>
</TabControl>
</Grid>
</Window>

后台

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows; namespace WPFDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
view = new MainWindowView();
view.DgList = new System.Collections.ObjectModel.ObservableCollection<DgModel>();
this.DataContext = view;
InitData();
}
MainWindowView view;
private void InitData()
{
var list = new List<DgModel>();
Random rd = new Random();
for (int i = 0; i < 50; i++)
{
var item = new DgModel();
item.F1 = rd.Next().ToString();
item.F2 = rd.Next().ToString();
item.F3 = rd.Next().ToString();
item.F4 = rd.Next().ToString();
item.F5 = rd.Next().ToString();
item.F6 = rd.Next().ToString();
item.F7 = rd.Next().ToString();
item.F8 = rd.Next().ToString();
item.F9 = rd.Next().ToString();
item.F10 = rd.Next().ToString();
list.Add(item);
}
Stopwatch ms = new Stopwatch();
ms.Restart();
view.DgList = new System.Collections.ObjectModel.ObservableCollection<DgModel>(list);
ms.Stop();
view.DgMs = ms.ElapsedMilliseconds.ToString();
ms.Restart();
view.LvList = new System.Collections.ObjectModel.ObservableCollection<DgModel>(list);
ms.Stop();
view.LvMs = ms.ElapsedMilliseconds.ToString();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
InitData();
}
}
}

相关回答:

ListView和ListBox的区别?(ListView是数据表格,ListBox是类似Tree的单选列表)

博主使用的是第三方开源控件HandyControl(强烈安利)

博客园空间不足,Demo加群下载

WPF DataGrid与ListView性能对比与场景选择的更多相关文章

  1. WPF DataGrid、ListView 简单绑定

    DataGrid运行效果: xaml 代码: DataGridName= dtgData ItemsSource= {Binding} AutoGenerateColumns= False DataG ...

  2. 不同Framework下StringBuilder和String的性能对比,及不同Framework性能比(附Demo)

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 环境搭建 测试用例 MSDN说明 ...

  3. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

  4. java中常见的json解析方法、库以及性能对比

    常见的json解析有原生的JSONObject和JSONArray方法,谷歌的GSON库,阿里的fastjson,还有jackson,json-lib. Gson(项目地址:https://githu ...

  5. [原] KVM 环境下MySQL性能对比

    KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...

  6. 【腾讯Bugly干货分享】跨平台 ListView 性能优化

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...

  7. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  8. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  9. Java--Stream,NIO ByteBuffer,NIO MappedByteBuffer性能对比

    目前Java中最IO有多种文件读取的方法,本文章对比Stream,NIO ByteBuffer,NIO MappedByteBuffer的性能,让我们知道到底怎么能写出性能高的文件读取代码. pack ...

  10. C正则库做DNS域名验证时的性能对比

    C正则库做DNS域名验证时的性能对比   本文对C的正则库regex和pcre在做域名验证的场景下做评测. 验证DNS域名的正则表达式为: "^[0-9a-zA-Z_-]+(\\.[0-9a ...

随机推荐

  1. 指定的参数已超出有效值的范围 参数名: utcDate WebResource异常

    指定的参数已超出有效值的范围.参数名: utcDate 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息.  异常详细信息 ...

  2. 【Unity Shaders】学习笔记——SurfaceShader(一)认识结构

    [Unity Shaders]学习笔记——SurfaceShader(一)认识结构 转载请注明出处:http://www.cnblogs.com/-867259206/p/5595747.html 写 ...

  3. 集合-Collection

    集合中存放的依然是对象的引用,而不是对象本身 ArrayList: 1) ArrayList底层使用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的O ...

  4. JavaScript学习总结【2】、JS基础

    1.JS 命名规范 命名规范是很有必要的,可增强代码的可读性,一眼就能看懂要表达的意思,规范就是符合规则,使代码有利于后期维护,也能很大程度的提高开发效率.一个正常的网站有很多 JS 代码,如果在编写 ...

  5. centos6.5 搭建php5.5+mysql5.5+apache2.4

    本文总结了Linux下 root.常用查找命令.卸载软件方法(见二.安装PHP5.5).配置软件源(见二).安装软件(见二)与高版本替换软件(见三.安装MySQL)的方法. 迁移网站,机器上原本已有p ...

  6. JS题目

    1.请你谈谈Cookie的弊端 cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很多局限性的. 第一:每个特定的域名下最多生成20个cookie 1.IE6或更低版本最 ...

  7. Java核心技术及面试指南 多线程部分的基本面试题总结以及答案

    7.1.5 (1) 如果某个类已经继承(extends)了一个类,那么让这个类具有多线程的特性? implements runnable类或通过线程池 7.1.5  (2)启动一个线程是用run()还 ...

  8. html5 javascript 事件练习3键盘控制练习

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  9. Struts2 使用Jquery+ajax 文件上传

    话不多说 直接上代码 前台js: var formData = new FormData(); formData.append("file1",$("#file1&quo ...

  10. [Robot Framework] SikuliLibrary的关键字执行依赖java进程,但是上次的java进程如果没有杀掉,robot framework控制台的日志出不来,怎么办?

    如果在suite的setup里面杀掉java进程:AutoItLibrary.Run | taskkill /F /IM java.exe 执行sikuli的关键字会报这样的错误: Connectio ...