.NET各大平台数据列表控件绑定原理及比较(WebForm、Winform、WPF)

简介:

说说WebForm:

数据列表控件:

WebForm 下的列表绑定控件基本就是GridView、DataList、Repeater;当然还有其它DropDownList、ListBox等。


它们的共同的设置数据源方法:

XXX.DataSource=数据源。


那么这个数据源的格式,究竟有啥要求?最简单的方式是随便给弄个,然后等它抛异常:


从上面的错误可以看的出来,基本上支持三种数据源绑定方式:IListSource,IEnumerable,IDataSource。


说说Winform

数据列表控件:

WinForm 下的列表绑定控件基本就是DataGridView、ListView、ComboBox等。


它们的共同的设置数据源方法:

XXX.DataSource=数据源。


用同样的方式,发现它是死活不抛异常的,通过对DataGridView的DataSource查看代码:

一个不够再看一下ComboBox的DataSource:

从以上的提示可以得到信息,数据源支持:IListSource接口。


看看WPF

数据列表控件:

WPF 下的列表绑定控件基本就是DataGrid、ListBox、ComboBox等。


它们的共同的设置数据源方法:

XXX. ItemsSource =数据源。


对于WPF,它的ItemsSource不再是Object类型,而是IEnumerable:

从以上的提示可以得到信息,数据源支持:IEnumerable接口。


三者比较:

WebForm: IListSource,IEnumerable,IDataSource。

Winform: IListSource

WPF:   IEnumerable


共同点:

由于IListSource的接口有个必须的实现是返回IList,而IList接口本身也有继承自IEnumerable接口。

所以最终的共同点就是都IEnumerable接口,通俗的说就是都支持:List<T>集合这样的数据源。


不同点:(以IDataReader,DataTable,DataSet等通用集合来说明)

WebForm:支持IDataReader,DataTable,DataSet。

Winform:不支持IDataReader, 支持DataTable,DataSet。

WPF:支持IDataReader,不支持DataTable,DataSet。


这里面又有些故事:


Winform:为虾米不支持IDataReader?

对于DataGridView列表控件,其实表格是可以直接修改的,而且修改的值,会直接返改到绑定的数据源上。

可能出于这种性质,对于只读的IDataReader来说,它不太适合DataGridView控件上的读写双需求,所以不支持。


Winform下的DataTable绑定:

对于List<T>,可以方便的修改集合的属性,而对于DataTable,这是个复杂的自定义类,要绑定的东西并不是表的基本属性,而是存在另一个集合DataRowCollection中。

所以,设计人员搞出了:PropertyDescriptor 和ICustomTypeDescriptor等一套规范来实现属性描述和自定义类的取值绑定问题。


WPF:竟然不考虑DataTable支持:

估计双方没沟通好,或者是考虑到新的DataGrid又返朴归真,去掉了写的需求,WPF竟然不支持DataTable, 好在还有个属性DefaultView,可以把信息读到类似集合的DataTableView再去绑定,虽然多转了一步,但也算是勉强支持绑定了。



再说MDataTable

MDataTable是CYQ.Data 数据层框架里极重要的一组类,实现了和数据库间的完整映射,同时也肩负着和各种UI打交道,当然了,没有它我也不可能去研究各种绑定了。

对于自定义MDataTable数据源,在绑定列表控件的这条路上,几年前我研究了很久,后来最稳定的实现为:

public class MDataTable : IDataReader, IEnumerable,IListSource


为何MDataTable在WPF下和DataTable一样失效了?

这里其实有一个和DataTable不同的东西,就是我的自定义数据源继承了IDataReader和IEnumerable,简单的说是支持WPF的。


但是结果为啥绑定无效?

经过代码调试,发现了原来是接口的优先级问题热的祸, IListSource的级别比IEnumerable的先被调用了,结果就走了类似DataTable那一套规则,但那一套规则的属性读取和WPF是无效的,结果就变成了属性绑定,而不是数据行绑定。


解决的办法:

由于IListSource的存在,会导致WPF无法正常绑定,那就把这接口去掉了,发现WPF就正常了。

但是问题又来了,Winform是靠IListSource接口才能绑定,去掉了IListSource,在winform下不正常了。

经过一番深思,考虑了DataTable依靠DataTableView的方式来绑定WPF,我亮出了一招:


说明:

把IListSource接口的实现,分到了另一个类 MDataTableView,注意修饰为内部类,说明对于使用者来说,一切是还是照旧,但是内部在MDataTable.Bind方法调用是有识别当前的平台,如果是Winform,则把对象变更为:new MDataTableView(ref sourceObje)


总结:

虽然各位平时和这些列表控件相依为命,但估计研究绑定机制的,还是比较少的,毕竟需要一定的缘分。

今天的内容就当个参考,待某天缘分来的时候,有需要的时候,再来回顾我这篇文章亦可。






     本文转自cyq1162 51CTO博客,原文链接:http://blog.51cto.com/cyq1162/1270453,如需转载请自行联系原作者


相关文章
|
4月前
|
存储 设计模式 编解码
.NET 8.0 通用管理平台,支持模块化、WinForms 和 WPF
【11月更文挑战第5天】本文分析了.NET 8.0 通用管理平台在模块化、WinForms 和 WPF 方面的优势。模块化设计提升了系统的可维护性和可扩展性,提高了代码复用性;WinForms 提供了丰富的控件库和简单易用的开发模式,技术成熟稳定;WPF 支持强大的数据绑定和 MVVM 模式,具备丰富的图形和动画功能,以及灵活的布局系统。
170 2
|
5月前
|
设计模式 前端开发 C#
使用 Prism 框架实现导航.NET 6.0 + WPF
使用 Prism 框架实现导航.NET 6.0 + WPF
199 10
|
7月前
|
开发框架 缓存 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
|
7月前
|
C# 开发者 Windows
一款基于Fluent设计风格、现代化的WPF UI控件库
一款基于Fluent设计风格、现代化的WPF UI控件库
174 1
|
7月前
|
C# Windows
WPF中如何使用HandyCotrol控件库
WPF中如何使用HandyCotrol控件库
307 1
|
7月前
|
开发框架 前端开发 JavaScript
WPF应用开发之控件动态内容展示
WPF应用开发之控件动态内容展示
|
7月前
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
|
7月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
134 0
|
7月前
|
C# 前端开发 UED
WPF数据验证实战:内置控件与自定义规则,带你玩转前端数据验证,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,数据验证是确保输入正确性的关键环节。前端验证能及时发现错误,提升用户体验和程序可靠性。本文对比了几种常用的WPF数据验证方法,并通过示例展示了如何使用内置验证控件(如`TextBox`)及自定义验证规则实现有效验证。内置控件结合`Validation`类可快速实现简单验证;自定义规则则提供了更灵活的复杂逻辑支持。希望本文能帮助开发者更好地进行WPF数据验证。
247 0
|
7月前
|
C# UED 定位技术
WPF控件大全:初学者必读,掌握控件使用技巧,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,控件是实现用户界面交互的关键元素。WPF提供了丰富的控件库,包括基础控件(如`Button`、`TextBox`)、布局控件(如`StackPanel`、`Grid`)、数据绑定控件(如`ListBox`、`DataGrid`)等。本文将介绍这些控件的基本分类及使用技巧,并通过示例代码展示如何在项目中应用。合理选择控件并利用布局控件和数据绑定功能,可以提升用户体验和程序性能。
248 0

相关实验场景

更多