【WPF.NET开发】优化性能:数据绑定

本文内容

  1. 如何解析数据绑定引用
  2. 绑定到大型 CLR 对象
  3. 绑定到 ItemsSource
  4. 将 IList 绑定到 ItemsControl 而非 IEnumerable
  5. 请勿仅为数据绑定而将 CLR 对象转换为 XML

Windows Presentation Foundation (WPF) 数据绑定功能提供了一种简单一致的方法来呈现应用程序和与数据交互。 元素能够以 CLR 对象和 XML 的形式绑定到各种数据源中的数据。

本主题提供数据绑定性能方面的建议。

1、如何解析数据绑定引用

在讨论数据绑定性能问题前,有必要了解 Windows Presentation Foundation (WPF) 数据绑定引擎如何解析用于绑定的对象引用。

Windows Presentation Foundation (WPF) 数据绑定的源可以是任意 CLR 对象。 可绑定到 CLR 对象的属性、子属性或索引器。 绑定引用是通过使用 Microsoft .NET Framework 反射或 ICustomTypeDescriptor 解析的。 以下为解析用于绑定的对象引用的三种方法。

第一种方法涉及到使用反射。 在这种情况下,会使用 PropertyInfo 对象来发现属性的特性并提供对属性元数据的访问。 使用 ICustomTypeDescriptor 接口时,数据绑定引擎使用此接口来访问属性值。 在对象没有一组静态属性的情况下,ICustomTypeDescriptor 接口尤为有用。

可以通过实现 INotifyPropertyChanged 接口或使用与 TypeDescriptor 关联的更改通知来提供属性更改通知。 但是,实现属性更改通知的首选策略是使用 INotifyPropertyChanged。

如果源对象是 CLR 对象且源属性是 CLR 属性,则 Windows Presentation Foundation (WPF) 数据绑定引擎需要先在源对象上使用反射来获取 TypeDescriptor,然后再查询 PropertyDescriptor。 从性能角度看,此反射操作序列可能非常耗时。

解析对象引用的第二种方法涉及到实现 INotifyPropertyChanged 接口的 CLR 源对象以及作为 CLR 属性的源属性。 这种情况下,数据绑定引擎直接在源类型上使用反射,并获取所需的属性。 这依然不是最佳方法,但相较于第一种方法,这种方法在工作集要求方面的成本低。

解析对象引用的第三种方法涉及到作为 DependencyObject 的源对象以及作为 DependencyProperty 的源属性。 这种情况下,数据绑定引擎无需使用反射。 属性引擎和数据绑定引擎共同独立地解析属性引用。 这是解析用于数据绑定的对象引用的最佳方法。

下表比较了使用这三种方法对一千个 TextBlock 元素的 Text 属性进行数据绑定的速度。

展开表

绑定 TextBlock 的文本属性绑定时间 (ms)呈现时间 -- 包括绑定 (ms)
绑定到 CLR 对象的属性115314
绑定到实现 INotifyPropertyChanged 的 CLR 对象的属性115305
绑定到 DependencyObject 的 DependencyProperty。90263

2、绑定到大型 CLR 对象

数据绑定到具有数千个属性的单个 CLR 对象时会出现明显的性能影响。 可以通过将单个对象分成具有较少属性的多个 CLR 对象来最大限度地降低此影响。 下表列出了数据绑定到单个大型 CLR 对象和多个较小对象的绑定时间和呈现时间。

展开表

数据绑定 1000 个 TextBlock 对象绑定时间 (ms)呈现时间 -- 包括绑定 (ms)
绑定到具有 1000 个属性的 CLR 对象9501200
绑定到 1000 个具有 1 个属性的 CLR 对象115314

3、绑定到 ItemsSource

假设你有一个包含员工列表的 CLR List<T> 对象,并且你想在 ListBox 中显示此列表。 若要在这两个对象之间创建对应关系,应将员工列表绑定到 ListBox 的 ItemsSource 属性。 不妨再假设有一个加入组的新员工。 你可能会想,若要将这名新员工插入到绑定的 ListBox 值中,仅需将这名新员工添加到员工列表即可,数据绑定引擎应该会自动识别此更改。 这种看法并不正确;实际上,更改不会自动反映在 ListBox 中。 这是因为 CLR List<T> 对象不会自动引发集合更改事件。 若要使 ListBox 接受更改,你需重新创建员工列表并将它重新附加到 ListBox 的 ItemsSource 属性。 此解决方案尽管起作用,但是会随之产生很大的性能影响。 每当将 ListBox 的 ItemsSource 重新分配到新对象时,ListBox 会首先抛弃它先前的项,然后重新生成它的整个列表。 如果 ListBox 映射到复杂的 DataTemplate,则性能影响会被放大。

针对此问题的一个非常高效的解决方案是使员工列表成为 ObservableCollection<T>。 ObservableCollection<T> 对象会引发数据绑定引擎可接收的更改通知。 此事件从 ItemsControl 添加或删除项,无需重新生成整个列表。

下表显示了添加一个新项时更新 ListBox(其中 UI 虚拟化处于关闭状态)所需的时间。 第一行中的数字表示 CLR List<T> 对象绑定到 ListBox 元素的 ItemsSource 的用时。 第二行中的数字表示 ObservableCollection<T> 绑定到 ListBox 元素的 ItemsSource 的用时。 请注意,使用 ObservableCollection<T> 数据绑定策略可节省大量时间。

展开表

数据绑定 ItemsSource1 个项的更新时间 (ms)
绑定到 CLR List<T> 对象1656
绑定到 ObservableCollection<T>20

4、将 IList 绑定到 ItemsControl 而非 IEnumerable

如果可以在将 IList<T> 还是 IEnumerable 绑定到 ItemsControl 对象之间进行选择,请选择 IList<T> 对象。 将 IEnumerable 绑定到 ItemsControl 会强制 WPF 创建一个包装器 IList<T> 对象,这意味着性能会因第二个对象不必要的开销而受到影响。

5、请勿仅为数据绑定而将 CLR 对象转换为 XML

WPF 使你可以数据绑定到 XML 内容;但是,数据绑定到 XML 内容的速度比数据绑定到 CLR 对象的速度更慢。 如果目的仅在于数据绑定,请勿将 CLE 对象数据转换为 XML。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day38_MySQL

今日内容 0 复习昨日 1 引言 2 数据库 3 数据库管理系统 4 MySQL 5 SQL语言 0 复习昨日 1 引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。文件&…

删除有序数组中的重复项[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个非严格递增排列的数组nums&#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素只出现一次&#xff0c;返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。 考虑nums的唯一元素…

Source Insight 4的使用经验

问题1 函数结束提示符<<end tagDebugData>> 在source insight里的options→preference→syntax decorations→auto annotations→annotate closing braceswith end-comments关闭或启动显示. 但是有的有有的没有&#xff0c;奇怪! 参照网络答案&#xff1a; Sou…

DataX介绍

一、介绍 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 github地址 详细文档 操作手册 支持数据框架如下&#xff1a; 架构 Reader&#xff1…

IPV4 转 IPV6 解决方案大全

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

App全测试扫描漏洞工具

APP 有漏洞被测要下架&#xff0c;怎么处理&#xff1f; 如题&#xff0c;今天被问到&#xff1a;市面上有什么好的 APP 漏洞扫描工具推荐&#xff1f;我们的 APP 有漏洞&#xff0c;需要下架 APP&#xff1f; 前言 事情的经过是这样的&#xff1a; 1&#xff1a;学员公司测试…

UnityShader(九)Unity中的基础光照(下)

标准光照模型 光照模型有许多种&#xff0c;但在早期游戏引擎中&#xff0c;往往只使用一个光照模型&#xff0c;被称为标准光照模型。 标准光照模型只关心直接光照&#xff0c;也就是那些直接从光源发射出来照射到物体表面后&#xff0c;经过物体表面的一次反射直接进入摄像…

在Meteor Lake上测试基于Stable Diffusion的AI应用

上个月刚刚推出的英特尔新一代Meteor Lake CPU&#xff0c;预示着AI PC的新时代到来。AI PC可以不依赖服务器直接在PC端处理AI推理工作负载&#xff0c;例如生成图像或转录音频。这些芯片的正式名称为Intel Core Ultra处理器&#xff0c;是首款配备专门用于处理人工智能任务的 …

Backtrader 文档学习- Broker - Slippage

Backtrader 文档学习- Broker - Slippage 1.概述 回测无法保证真实的市场条件。无论市场模拟有多好&#xff0c;在真实市场条件下都可能发生滑点。这意味着&#xff1a; 请求的价格可能无法与真实市场的价格匹配 集成的回测broker支持滑点。以下参数可以传递给broker &#…

Android 在WebView中加载H5传递图片

最近h5开发一个编译器&#xff0c;要在手机上显示&#xff0c;需要获取手机上的图片&#xff0c;使用webview不能直接到文件管理拿取&#xff0c;还需要对webview做处理&#xff0c;做个记录&#xff0c;方便以后使用&#xff1b; public ValueCallback<Uri[]> mUploadMe…

【安装记录】在pve中创建debian12虚拟机

1、官网下载debian12:https://www.debian.org/ 2、安装虚拟机 &#xff08;1&#xff09;上传 iso 文件到pve服务器&#xff1a; 等待上传中。。。 上传完毕结果如下&#xff1a; &#xff08;2&#xff09;创建虚拟机 类别我也不清楚有什么区别&#xff1f;我看推荐使用host…

[数据结构与算法]哈希算法

目录 哈希算法 常见哈希函数&#xff1a; MD5 (Message Digest Algorithm 5): SHA-1 (Secure Hash Algorithm 1): SHA-256 (Secure Hash Algorithm 256-bit): 代码演示: 哈希算法 哈希算法是一种将任意长度的输入数据映射为固定长度的输出数据的算法。哈希函数的主要目标是…

golang实现pdf中自动换行的表格

需要用到的库&#xff1a;jung-kurt/gofpdf 由于CellFormat方法不支持\n换行&#xff0c;会被变成乱码&#xff0c;MultiCell方法会自动将坐标定位到下一行。所以需要自己实现坐标的计算变换。通过Rect方法画出单元格&#xff0c;MultiCell方法在格内自动换行写字&#xff0c;在…

瑞_数据结构与算法_红黑树

文章目录 1 什么是红黑树1.1 红黑树的背景1.2 红黑树的特性 ★★★ 2 红黑树的Java实现2.1 红黑树颜色枚举类Color2.2 红黑树节点类Node2.2.1 实现判断是否是左孩子方法isLeftChild()2.2.2 实现查找叔叔节点方法uncle()2.2.3 实现查找兄弟节点方法sibling() 2.3 红黑树类RedBla…

GoLang中应该避免的10个错误

Go是一种静态类型的、并发的、垃圾收集的编程语言&#xff0c;由谷歌开发。近年来&#xff0c;由于它的简单性、性能和对并发的强大支持&#xff0c;它已经获得了普及。尽管它很简单&#xff0c;但开发人员在编写Go代码时仍有一些常见的错误。下面是Go语言中需要避免的十大坏错…

Python如何递归删除空文件夹

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 1.Python如何递归删除空文件夹&#xff0c;这个问题很常见。 但大多数人的解决办法都是自己实现递归函数解决这个问题&#xff0c;其实根本不用那么麻烦。 Python中的os.walk提供了一种从内到外的遍历目录树的方法&#xff…

fullcalendar案例

fullcalendar案例 <script srchttps://cdn.jsdelivr.net/npm/fullcalendar6.1.10/index.global.min.js></script><script srchttps://code.jquery.com/jquery-3.6.0.min.js></script> <!-- 引入 jQuery CDN --><script>document.addEventL…

第5章 python深度学习——波斯美女

第5章 深度学习用于计算机视觉 本章包括以下内容&#xff1a; 理解卷积神经网络&#xff08;convnet&#xff09; 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

【前端-VUE】Vue3组件组成部分及组件通信(详解)

一、父子间通信 1.父传子&#xff1a; 2.子传父&#xff1a; 3.什么是prop Prop定义&#xff1a;组件上注册的一些自定义属性 Prop作用&#xff1a;向子组件传递数据 特点&#xff1a; 可以传递任意数量的prop可以传递任意类型的prop 3.1 props校验 思考&#xff1a;组件的prop…

母排设计时没有柜体3D数据?来试试SuperPanel的钣金功能!

CAD版SuperPanel软件能够助力用户快速、准确地设计和修改母排&#xff0c;同时快速输出加工图纸和数控加工代码。在壳体外购&#xff0c;没有柜体3D数据的情况下&#xff0c;如何轻松进行母排设计&#xff1f;一起来学习利驰数字母排的钣金功能吧&#xff01; SuperPanel的钣金…