Wpf GridControl 是我们网格的第三个版本,它基于 WPF 技术。前两个产品是基于Microsoft WinForms 技术的MFC Grid 和.Net Grid。在网格的第三次迭代中,Dapfor 的专家采用了以前产品的最佳功能,从而产生了比其他供应商所有现有解决方案都具有更好性能和易用性的组件。
Dapfor 的开发人员特别关注 WPF GridControl 线程安全,使网格能够通过 INotifyPropertyChanged 和 BindingList ( T ) 接口从任何线程接收通知。
- 框架:4.0、4.5 及更高版本
- 完全用托管 C# 编写
- 包含许多示例的综合文档,与 Visual Studio 集成
- 设计时集成
WPF GridControl 支持在一个或多个层次结构级别上同时处理不同数据类型。网格支持许多不同的数据类型,包括任意类对象和可以同时使用的各种数据集合。有关数据类型的更多详细信息,请参阅 Wpf 网格教程(第 1 部分:数据类型)部分。
数据类型:
- 任意类的对象
- 实现 IList 接口、对象或字符串数组的列表:object[] 或 string[]
- 字段数量可变的对象:IDictionary<string, object>
- 具有可变数量字段的对象能够通知数据更改的网格
- 在网格中同时使用不同类型的对象
Wpf GridControl 提供了多种数据源绑定方法。有关更多详细信息和示例,请参阅 Wpf 网格教程(第 2 部分:数据绑定)部分
- 将网格绑定到标准数据源(IList、 IBindingList、 DataTable、 DataSet)
- 同时绑定到 多个数据源 (例如 IList 或 IBindingList)
- 在一个集合中或在一个或多个层次结构级别的不同集合中同时使用一种或多种类型的数据
- 将任何行绑定 到数据源 (IList 或 IBindingList),从而可以在任何层次结构级别使用对象集合。
- 可以在不将网格绑定到集合的情况下添加未绑定的行
- 在任何层次结构级别上简单添加未绑定行
- 同时使用 未绑定的行和网格绑定到 一个或多个层次结构级别的集合
- 用于构建复杂层次结构的声明式层次绑定
- 结合不同对象的数据 并可以避免中间类(只有一个目的的类——结合不同类对象的属性以在网格中呈现组合数据的类)的声明性绑定
- 条件绑定 支持在绑定时修改数据层次结构(即添加或删除中间层次结构级别)
- 构建 与 DataRelation 链接的表的层次结构
在事件驱动编程模型中,应用程序的业务逻辑层与表示层完全分离。表示层 (Wpf GridControl) 通过数据绑定从数据层接收所有需要的信息。当业务对象值发生变化时,数据层通过 INotifyPropertyChanged 和IBindingList通知网格 接口。在收到数据层更改的通知时,Wpf GridControl 执行必要的操作(单元格更新、网格行排序、重新分组或自动过滤)。这需要最少的编程工作来实现现代应用程序中表示层的复杂行为。重要的是 Wpf GridControl 提供保护以防止来自主线程以外的其他线程的通知。这样的保护不仅可以实现数据层和表现层的功能分离,还可以保证线程安全。有关详细信息,请参阅 Wpf 网格教程(第 3 部分:事件驱动模型)部分。
事件驱动模型的主要能力:
- 可以使用实现 INotifyPropertyChanged 接口的数据,可以处理这些对象的事件
- 不依赖于数据源类型:实现 INotifyPropertyChanged 接口的数据可以存储在 IList / IBindingList 集合中,或者可以使用任何其他方法添加(例如使用 GridControl.Rows.Add (Object) / Row.Add ( Object) 方法)
- 包含在指定时间间隔内以指定颜色修改的值的单元格自动 闪烁 (两者都可以轻松更改)
- 自动 排序 包含触发通知的对象的行
- 如果需要,自动 重新分组网格数据。更改仅涉及包含触发通知的对象的行。此功能显着降低了 CPU 资源消耗
- 自动 过滤动态数据
- 不依赖于实现 INotifyPropertyChanged 接口的对象类型。支持同时使用不同类型的对象。
- 对从INotifyPropertyChanged 和 IBindingList 接口收到的通知进行线程安全处理 。
- 数据处理速度快。具有 5000 个元素的全屏网格每秒可以处理超过 30000 个通知,同时单元格闪烁。
数据过滤实际上是根据程序员设置的规则控制各个网格行的可见性。这些规则应该方便易用,不应该依赖于数据排序或分组,并且应该同样适用于静态和实时数据。
主要数据过滤功能
- 编程过滤或使用 UI 控件过滤
- 可在任何地方使用的过滤器集合
- 简单直观的数据过滤界面
- 任何层级的数据过滤
- 带或不带排序的数据过滤
- 带或不带分组的数据过滤
- 简单的数据过滤接口,用于 在网格连接到IBindingList (添加、删除或修改数据) 时自动 实时 过滤,或者在对象实现INotifyPropertyChanged 接口时使用事件驱动模型。
- 在任何层次结构级别同时进行数据过滤、排序和分组
- 高过滤速度。具有 5000 行的网格支持每秒超过 14000 次过滤操作。
数据分组是指按照相同的标准组合数据。在分组过程中,网格创建了一个中间层次结构级别,其中包含网格行满足的条件
分组能力
- 按一列或多列分组
- 在任何层次结构级别上分组,而不仅仅是在顶层
- 同时对不同层次结构级别的多个标题进行分组
- 支持在分组列中排序
- 同时使用数据过滤和分组,包括在列中使用图形过滤器
- 支持节目组创作
- 从IBindingList 或 INotifyPropertyChanged 接口获取通知后自动重新 分组数据
- 用于分组静态数据和动态实时数据的相同直观 API
- 分组速度快:5000个元素的网格可以在100毫秒内完成分组。一个包含 5000 个元素的网格每秒可以执行 20000 次实时数据重组操作。
数据排序是最重要的网格功能之一。与大多数第三方网格不同,Dapfor Wpf GridControl 支持对静态数据和实时动态变化的数据进行排序,并不断保持内容排序。在 MVVM 模型中,数据层可以通过 INotifyPropertyChanged 和 IBindingList 接口通知网格数据对象值的变化。如有必要,网格会自动执行线程同步,然后将更改了数据对象的行移动到新位置。
主要数据排序特点:
- 简单的排序界面
- 对不同类型的对象进行排序
- 多重排序
- 连接到同一数据集合的不同网格可以使用不同的排序
- 按未格式化的值排序(即,如果数据对象包含 DateTime 值,则网格比较此类型的值而不是显示的字符串)。这可以防止行比较错误并显着加快排序过程。
- 在不同的层次结构级别对数据进行排序
- 支持使用简单的 API 创建自定义排序规则
- 自动排序存储在 IBindingList中的数据或在事件驱动模型中 实现 INotifyPropertyChanged 接口的 数据
- 同时进行数据排序、分组和过滤
- 无论数据排序如何,停靠行 始终可以位于其层次结构级别的顶部或底部。这些行可用于显示分析信息或无论排序如何都应始终显示在顶部或底部的信息。
- 高速排序,包括实时数据排序。一个 5000 行的网格每秒可以执行超过 30000 次排序操作
数据闪烁意味着在指定的时间段内突出显示单元格背景。闪烁实现是一项复杂的技术任务,尤其是在 WPF 环境中。最复杂的是需要为很多单元格存储时间和颜色信息,这对CPU和内存资源的消耗很大。实施变得复杂,需要大量时间和高超的编程技能。Dapfor 大大简化了这项任务,提供了一个简单的 API,用于在指定时间段内使用预定义颜色闪烁单元格。
主要特征
- 支持在指定时间段内以预定义颜色动态闪烁数据。支持半透明颜色。
- 支持闪烁不同颜色和不同颜色强度的不同单元格
- 简单直观的界面:调用 Cell 。Blink(TimeSpan, Brush) 闪烁一个单元格。
- 收到来自 INotifyPropertyChanged 和 IBindingList 接口的通知时自动闪烁
- 高性能和低 CPU 和内存消耗
- 专门的算法可以在存储闪烁的细胞、颜色和时间段的数据时节省内存
在 Wpf 中,GridControl 标头用于存储列,这些列可用于管理内容显示和分组,以及在不同的层次结构级别上显示具有不同表示的内容。
可以有一个或多个标题,因此网格可以像 Windows 资源管理器一样以 TreeList 模式运行,也可以作为具有多个独立标题的全功能网格运行。
主要特征
- 可以将网格用作 具有一个标题的树列表视图 或用作具有多个独立标题的控件而不修改数据。
- 在任何层次结构级别的整个网格宽度上拉伸列的可能性。如果所有标题中的列都被拉伸,水平滚动条将变得不可见。
- 可以在任何层级设置任意数量的 冻结列。冻结的列始终可见,并且不涉及水平滚动。
- 绑定和未绑定的列
- 动态替换/添加/删除标题,无需数据替换(每个标题都有列、排序、分组等信息)。
- 按一列或多列分组。分组可以同时用于多个标题。
- 在一个或不同的层次结构级别上对单个或多个数据进行排序
- 使用列模板进行完全自定义。
- 独立控制不同层级的标题可见性。
- 在数据层次结构的第一行之前重复子标题(标题也可以隐藏)
- 用户可以通过 UI 拖放列、修改列边、移动、分组或排序。程序员可以阻止这些功能中的任何一个。
Wpf GridControl 为单元格和列模板化提供了许多功能。程序员可以在网格列或单元格中放置任何控件。
GridControl 模板化功能
- 能够在网格单元格中使用任何控件。
- 在网格单元中支持 DataTemplate 。
- 网格到 Cell的简单数据绑定, 以通过 DataTemplate显示信息。
- 支持 DataTemplateSelector 在不同的网格行中使用不同的模板。
- 在显示数据的单元格和处于编辑模式的单元格中支持不同的 DataTemplate 。
- 支持网格列中的模板。
Wpf GridControl 广泛使用样式来更改其内部元素的表示。有些样式是预定义的,但程序员可以在 XAML 文件中创建自定义样式。除了样式之外,网格还提供了一个简单的 API,用于更改主
GridControl 自定义功能
- 支持预定义的样式和主题
- 在 XAML 文件中创建自定义样式
- 在应用程序级别和网格级别使用主题。
- 将样式应用于 Wpf 网格的任何元素。
GridControl 导航使用户可以通过键盘或鼠标访问相关信息。在导航期间,用户可以选择各种网格行。为了改善感知,Dapfor 的开发人员实施了半透明选择模式。除此之外,所有选定行周围都有一个框架,而不是每行周围都有单独的框架。这使得内部网格架构更加复杂,但大大改善了数据感知。
最重要的选择和导航功能
- 不隐藏单元格背景的半透明行选择。简单明了的选择显示
- 不同的选择模式:单一和多重
- 支持行和单元格选择模式
- 支持套索选择
- 基于程序的选择控制
- 使用向上/向下/向左/向右/PageUp/PageDown/Home/End/Space 键的标准导航。支持基于程序的导航。
- 精心设计的快捷方式简化了数据处理。大多数快捷方式基于标准的 Microsoft 控件行为,例如 keyRight 打开层次结构,keyLeft 关闭层次结构。
- 鼠标滚轮滚动
- 在可见网格区域显示内容的简单方法: Row 。EnsureVisible () / 列。确保可见()
图形控件通常不是线程安全的。任何方法或属性调用都必须通过调用 Dispatcher 来同步。调用(代表, 对象[] ) /调度程序。开始调用(代表, 对象[] ) 方法。从INotifyPropertyChanged 和 IBindingList接口接收通知时需要相同的同步 从实际的角度来看,这意味着线程同步必须由应用程序的业务层完成,因此数据与表示没有分离。Dapfor 的 Wpf GridControl 是线程安全的,它与主线程执行同步,使业务逻辑可以在任何线程中运行。这种方法极大地简化了多线程应用程序逻辑并优化了线程同步以最大程度地提高性能。 ...
主要特征
- 添加、删除和修改数据的线程安全操作
- IBindingList 和 INotifyPropertyChanged 接口是线程安全的。根据这些接口的通知,工作线程会自动与 GUI 线程同步。
- 线程安全的排序、分组和过滤
- 网格支持同步和异步模型的数据同步接收来自 INotifyPropertyChanged 接口的通知
- 在具有不同层次结构、编辑器和外观的不同网格之间共享相同的数据源
- 用于确定网格中行位置的丰富 API 。(可见位置、层次结构中的位置、父行、子项、过滤等)
- 丰富的 数据格式
- 使 Wpf GridControl 的任何部分无效的简单 API
- 实时滚动
- 应用部署只需要一个程序集 Dapfor.Wpf.dll
- 由于 Dapfor.Wpf.dll 包含最少数量的图像,因此该库的大小不超过 1 MB。
- 部署到无限数量的终端计算机,无需任何费用
- Dapfor.Wpf.dll 可以用作其他库的组件,供其他开发人员使用。
- 无需安装 Dapfor 软件即可在客户计算机上部署库。
Dapfor 的开发者高度关注网格性能,优化了各种系统和算法。优化不仅涉及最大性能,还涉及最小内存消耗和最小线程同步上下文切换量。Wpf GridControl 在不同工作模式下使用的实际结果显示在 Wpf Grid 性能部分
主要性能特点
- 高插入率:> 100 000 行/秒
- 高去除率:> 500 000 行/秒
- 高分组率:> 50 000行/秒
- 高实时重组率:在 5 000 行的网格中每秒 > 20 000 行
- 高实时过滤率:在 5 000 行的网格中每秒 > 14 000 行
- 高效排序算法:在 5 000 行的网格中每秒 > 30 000 次排序操作
- 更新速度快,在 5 000 行的网格中闪烁超过 30 000 个单元格/秒。
- 低内存消耗:100 000 行的网格消耗 < 16 MB。
- 绩效改进的实用建议
- 400多个NUnit 测试,涵盖 Wpf GridControl 的所有主要功能
- 测试代码覆盖率:各种算法(排序、分组等)> 65%,数据级别> 65%,线程> 80%
- QA 团队致力于确保 Wpf GridControl 质量
- QA 团队或我们的客户发现的错误已系统地包含在新的 NUnit 测试中。