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

XML 复制代码
<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属性的类型是一个字符串数组。

  1. 初始化虚拟源:

C#

cs 复制代码
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);
}
  1. 处理虚拟源:

C#

cs 复制代码
public MainWindow() {
// ...
Unloaded += (o, e) => {
source.Dispose();
};
}
  1. 从数据源获取行:

C#

cs 复制代码
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#

cs 复制代码
public MainWindow() {
// ...
grid.ItemsSource = source;
}
相关推荐
AI_零食1 天前
开源鸿蒙跨平台Flutter开发:昼夜节律与睡眠相位-脑电波周期与最佳苏醒测绘架构
flutter·ui·华为·架构·开源·harmonyos·鸿蒙
stevenzqzq1 天前
推荐页核心 UI 实现逻辑说明
ui
AI_零食1 天前
Flutter 框架跨平台鸿蒙开发 - 自定义式按钮设计应用
学习·flutter·ui·华为·harmonyos·鸿蒙
千百元2 天前
codex 中使用 ui-ux-pro-max-skill
ui·ux
武藤一雄2 天前
C# 异常(Exception)处理避坑指南
windows·microsoft·c#·.net·.netcore·鲁棒性
步步为营DotNet2 天前
剖析.NET 11 中 Native AOT 在高性能客户端应用的极致实践
.net
samroom2 天前
【鸿蒙应用开发 Dev ECO Studio 5.0版本】从0到1!从无到有!最全!计算器------按钮动画、滑动退格、中缀表达式转后缀表达式、UI设计
数据结构·ui·华为·typescript·harmonyos·鸿蒙
步步为营DotNet2 天前
深度探索.NET Aspire在云原生应用性能与安全加固的创新实践
安全·云原生·.net
武藤一雄2 天前
WPF中ViewModel之间的5种通讯方式
开发语言·前端·microsoft·c#·wpf
我是唐青枫2 天前
C#.NET TPL Dataflow 深入解析:数据流管道、背压控制与实战取舍
c#·.net