当前位置: 首页 > news >正文

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; }
http://www.cnnetsun.cn/news/61209.html

相关文章:

  • FMEA在软件可靠性测试中的实践与应用
  • Playwright MCP在UI自动化测试中的定位与思考
  • 友达 G170ETN02.1 工业液晶显示屏:17.0 英寸超宽温高亮度场景的显示驱动技术解析
  • Harmony之路:服务卡片——打造桌面上的“原子化服务“
  • JVM内存模型详解
  • 源启高校・郑航站圆满落幕!鸿蒙 6.0 适配实战 + 职业机遇双赋能,解锁开源新可能
  • 腾讯混元大模型开源:520亿激活参数改写行业效率标准
  • 计算机专业毕业=码农?网络安全正在重塑你的职业天花板
  • 120亿参数颠覆智能体市场:GLM-4.5-Air-FP8如何重新定义企业AI效率标准
  • Forget-Me-Not: 建议采用一种简单的提示技术,防止在长时间的提示中遗忘信息
  • 数据处理服务:G1/ZGC如何提升稳定性
  • 18、使用 Neutron 创建独立路由器
  • 什么是回溯算法
  • 7、OpenStack网络配置与Linux桥接网络详解
  • Web服务器性能优化终极指南:快速提升响应时间
  • 古城景区管理|基于springboot + vue古城景区管理系统(源码+数据库+文档)
  • 腾讯开源HunyuanVideo-Avatar:一张照片+14秒音频,开启数字人创作全民时代
  • AI提示词实战技巧:从新手到专家的五个关键突破
  • agsXMPP使用
  • HTML图像与多媒体:img、picture、figure、video标签深度解析
  • 区块链 Web3 外包开发公司
  • Claude Code Router智能路由系统:5步实现多AI模型自动调度
  • 3天掌握专业RAW照片处理:darktable零基础快速上手指南
  • CogAgent-9B:2025年视觉语言模型的GUI交互革命
  • Awesome-CV模板完全攻略:打造专业双语简历的终极方案
  • PowerShell自动化运维终极指南:系统管理的革命性工具集
  • 解锁Discord隐藏权限:从用户视角到管理视角的无缝切换
  • 35亿参数重构边缘智能:Liquid AI LFM2-350M开启终端AI效率革命
  • AI产品经理思维揭秘:普通人如何转型成为未来10年最抢手的职业人才!
  • 大语言模型开源突破终极指南:从万亿参数到产业落地