news 2026/3/13 6:03:45

DevExpress WPF中文教程:Data Grid - 如何绑定到有限制的自定义服务(一)?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DevExpress WPF中文教程:Data Grid - 如何绑定到有限制的自定义服务(一)?

DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件的衍伸产品,还是以数据为中心的商业智能产品,都能通过DevExpress WPF控件来实现。

本文将演示如何将GridControl绑定到有限制的自定义服务(例如,不兼容的过滤器和排序),由于内容较多,我们将分为几篇文章来阐述,欢迎持续关注我们哟~

获取DevExpress WPF v25.1正式版下载

Step 1:获取数据并启用滚动

在此步骤中,您将创建一个虚拟源,从服务中获取行,并在GridControl中启用滚动。

注意:在本教程中,使用Issues Service作为数据源的示例。

获取数据和启用滚动

1. 添加一个GridControl,列对应于Issues Service的IssueData到您的项目窗口:

XAML

<dxg:GridControl x:Name="grid" > <dxg:GridControl.Columns> <dxg:GridColumn FieldName="Subject" /> <dxg:GridColumn FieldName="User" /> <dxg:GridColumn FieldName="Created" /> <dxg:GridColumn FieldName="Votes" /> <dxg:GridColumn FieldName="Tags" /> </dxg:GridControl.Columns> </dxg:GridControl>

注意GridControl不能显示Tags列的值,因为IssueData.Tags属性的类型是一个字符串数组。

2. 初始化虚拟源:

  • 创建一个虚拟源(本教程中的InfiniteAsyncSource)。
  • 创建自定义Tags属性并将字符串数组转换为单个字符串-逗号分隔的标签列表(参见CreateTagsProperty方法)。
  • 指定VirtualSourceBase.CustomProperties属性。

C#

public MainWindow() { InitializeComponent(); var source = new InfiniteAsyncSource() { CustomProperties = GetCustomProperties() }; } static DynamicPropertyDescriptor CreateTagsProperty() { return new DynamicPropertyDescriptor( name: "Tags", propertyType: typeof(string), getValue: x => string.Join(", ", ((IssueData)x).Tags)); } static PropertyDescriptorCollection GetCustomProperties() { var customProperties = TypeDescriptor.GetProperties(typeof(IssueData)) .Cast<PropertyDescriptor>() .Where(x => x.Name != "Tags") .Concat(new[] { CreateTagsProperty() }) .ToArray(); return new PropertyDescriptorCollection(customProperties); }

3. 处理虚拟源:

  • 处理窗口的Unloaded事件。
  • 调用VirtualSourceBase.Dispose方法。

C#

public MainWindow() { // ... Unloaded += (o, e) => { source.Dispose(); }; }

4. 从数据源获取行:

  • 处理InfiniteAsyncSource.FetchRows事件。
  • 使用 Issues Service的GetIssuesAsync方法获取数据。
  • 创建FetchRowsResult类对象并指定FetchRowsAsyncEventArgs.Result属性。

C#

public MainWindow() { // ... source.FetchRows += (o, e) => { e.Result = FetchRowsAsync(e); }; } static async Task<FetchRowsResult> FetchRowsAsync(FetchRowsAsyncEventArgs e) { IssueSortOrder sortOrder = GetIssueSortOrder(e); IssueFilter filter = MakeIssueFilter(e.Filter); const int pageSize = 30; var issues = await IssuesService.GetIssuesAsync( page: e.Skip / pageSize, pageSize: pageSize, sortOrder: sortOrder, filter: filter); return new FetchRowsResult(issues, hasMoreRows: issues.Length == pageSize); } static IssueSortOrder GetIssueSortOrder(FetchRowsAsyncEventArgs e) { return IssueSortOrder.Default; } static IssueFilter MakeIssueFilter(CriteriaOperator filter) { return null; }

通过将生成的虚拟源实例赋值给DataControlBase.ItemsSource属性,将GridControl绑定到虚拟源:

C#

public MainWindow() { // ... grid.ItemsSource = source; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 0:25:39

RBAC权限管理实例

一、RBAC是什么RBAC&#xff0c;即Role-Based Access Control&#xff0c;是一种在计算机系统和网络安全领域广泛应用的访问控制模型。它通过将权限分配给角色&#xff0c;再将角色分配给用户&#xff0c;来实现对系统资源的访问控制。在RBAC模型中&#xff0c;用户与角色之间、…

作者头像 李华
网站建设 2026/3/13 0:53:50

Harmony之路:跨设备协作——分布式数据对象同步

Harmony之路&#xff1a;跨设备协作——分布式数据对象同步从设备发现到数据同步&#xff0c;构建真正的无缝跨设备体验在上一篇中&#xff0c;我们学习了如何通过分布式软总线发现和认证周边设备。现在&#xff0c;当设备建立连接后&#xff0c;一个更重要的需求出现了&#x…

作者头像 李华
网站建设 2026/3/13 0:51:34

iptv-checker终极指南:从零开始掌握IPTV源检测技巧

还在为IPTV播放源频繁失效而烦恼吗&#xff1f;面对数百个频道逐个测试既耗时又耗力。本文将带你从零开始全面掌握iptv-checker工具的使用方法&#xff0c;通过简单三步即可实现播放源的智能检测与筛选。 【免费下载链接】iptv-checker IPTV source checker tool for Docker to…

作者头像 李华
网站建设 2026/3/12 0:48:22

Session、Cookie、Token讲解

目录一、Cookie讲解1、概念2、Cookie 的主要属性3、使用流程4、cookie 主要特点二、Session讲解1、Session概念2、流程图3、Session和Cookie的区别三、token讲解1、概念2、Token的组成3、Token认证流程四、三者对比我们都知道 HTTP 协议是无状态的&#xff0c;所谓的无状态就是…

作者头像 李华
网站建设 2026/3/12 23:10:16

快速上手React代码差异可视化组件

快速上手React代码差异可视化组件 【免费下载链接】react-diff-view A git diff component 项目地址: https://gitcode.com/gh_mirrors/re/react-diff-view 还在为代码审查时眼花缭乱的差异对比而烦恼吗&#xff1f;react-diff-view正是你需要的解决方案&#xff01;这个…

作者头像 李华