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

DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(三)

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

本文将为大家一步一步演示如何在一个MVVM应用程序中使用虚拟源。

DevExpress WPF中文教程图集

注意:本教程使用Issues Service作为示例数据源,使用InfiniteAsyncSource作为虚拟数据源。

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

Step 3: 启用过滤器操作

您可以允许用户在GridControl中过滤行,完成以下步骤:

1. 在虚拟源中实现过滤操作。

2. 在GridControl中启用过滤器操作。

DevExpress WPF中文教程图集

过滤器类型

Issues Service可以获取行:

  • 具有指定的优先级。
  • 在一段时间内(在CreatedFrom和CreatedTo之间)。
  • 获得最多的票数。

C#

public class IssueFilter {
public Priority? Priority { get; private set; }
public DateTime? CreatedFrom { get; private set; }
public DateTime? CreatedTo { get; private set; }
public int? MinVotes { get; private set; }
}

下面的代码片段获取不带过滤条件的行:

C#

[Command]
public void FetchIssues(FetchRowsAsyncArgs args) {
args.Result = GetIssuesAsync(args);
}
async Task<FetchRowsResult> GetIssuesAsync(FetchRowsAsyncArgs args) {
var take = args.Take ?? 30;
var issues = await IssuesService.GetIssuesAsync(
skip: args.Skip,
take: take,
sortOrder: GetIssueSortOrder(args.SortOrder),
filter: null
);return new FetchRowsResult(issues, hasMoreRows: issues.Length == take);
}
实现细节
创建过滤器转换器

1. 创建一个过滤器转换器。

2. 获取GridControl过滤器。

3. 解析过滤器并返回一个IssueFilter(模型中使用的类型),绑定到InfiniteAsyncSource.FetchRowsCommand的命令在GridControl获取行时使用过滤器。

C#

public class IssueFilterConverter : MarkupExtension, IValueConverter {
object IValueConverter.Convert(object filter, Type targetType, object parameter, CultureInfo culture) {
return ((CriteriaOperator)filter).Match(
binary: (propertyName, value, type) => {
if (propertyName == "Votes" && type == BinaryOperatorType.GreaterOrEqual)
return new IssueFilter(minVotes: (int)value);
if (propertyName == "Priority" && type == BinaryOperatorType.Equal)
return new IssueFilter(priority: (Priority)value);
if (propertyName == "Created") {
if (type == BinaryOperatorType.GreaterOrEqual)
return new IssueFilter(createdFrom: (DateTime)value);
if (type == BinaryOperatorType.Less)
return new IssueFilter(createdTo: (DateTime)value);
}
throw new InvalidOperationException();
},
and: filters => {
return new IssueFilter(
createdFrom: filters.Select(x => x.CreatedFrom).SingleOrDefault(x => x != null),
createdTo: filters.Select(x => x.CreatedTo).SingleOrDefault(x => x != null),
minVotes: filters.Select(x => x.MinVotes).SingleOrDefault(x => x != null),
priority: filters.Select(x => x.Priority).SingleOrDefault(x => x != null)
);
},
@null: default(IssueFilter)
);
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider) => this;
}

提示

上面的代码示例使用了FilterCriteriaMatchHelper.Match方法,该方法允许您解析GridControl创建的过滤条件。

FilterCriteriaMatchHelper是来自DevExpress.Xpf.Grid.v25.1.Extensions.dll库的扩展。

4. 将过滤器转化器分配给DataControlBase.CriteriaConverter属性,View中指定的过滤器转换器允许您避免在ViewModel中引用DevExpressData命名空间。

XML

<dxg:GridControl CriteriaConverter="{local:IssueFilterConverter}"/>

如果您可以在ViewModel中引用DevExpress.Data命名空间,则创建一个方法来解析ViewModel中的GridControl过滤器。

5. 当您指定DataControlBase.CriteriaConverter属性时,FetchAsyncArgsBase.Filter属性返回Object类型的过滤器,可以将此过滤器转换为过滤器转换器(本教程中的IssueFilter)返回的类型。

C#

[Command]
public void FetchIssues(FetchRowsAsyncArgs args) {
args.Result = GetIssuesAsync(args);
}
async Task<FetchRowsResult> GetIssuesAsync(FetchRowsAsyncArgs args) {
var take = Math.Min(args.Take ?? 30, 100);
var issues = await IssuesService.GetIssuesAsync(
skip: args.Skip,
take: take,
sortOrder: GetIssueSortOrder(args.SortOrder),
filter: (IssueFilter)args.Filter
);return new FetchRowsResult(issues, hasMoreRows: issues.Length == take);
}
获取优先级

获取优先级列表,并在Priority列下拉过滤器中显示它们:

DevExpress WPF中文教程图集

1. 创建GetUniqueValues命令。

2. 使用PropertyName属性获取GridControl为其收集唯一值的字段名。

3. 获取唯一值列表并将其分配给Result属性。

4. 将命令绑定到InfiniteAsyncSource.GetUniqueValuesCommand。

C#

[Command]
public void GetUniqueValues(GetUniqueValuesAsyncArgs args) {
if(args.PropertyName == "Priority") {
var values = Enum.GetValues(typeof(Priority)).Cast<object>().ToArray();
args.Result = Task.FromResult(values);
} else {
throw new InvalidOperationException();
}
}

XML

<dxg:GridControl CriteriaConverter="{local:IssueFilterConverter}">
<dxg:GridControl.ItemsSource>
<dx:InfiniteAsyncSource ElementType="{x:Type local:IssueData}"
FetchRowsCommand="{Binding FetchIssuesCommand}"
GetUniqueValuesCommand="{Binding GetUniqueValuesCommand}"/>
</dxg:GridControl.ItemsSource>
<!-- ... -->
</dxg:GridControl>

如果服务或数据库包含获取唯一值的方法,请在GetUniqueValues命令中使用该方法。

启用优先列过滤

允许用户通过Priority列过滤GridControl行,如下所示:

1. 将ColumnBase.AllowedBinaryFilters属性设置为Equals,来允许用户显示具有指定优先级的行。

2. 将ColumnBaseFilterPopupMode属性设置为List,来启用允许用户一次选择一个项的下拉过滤器。

XML

<dxg:GridColumn FieldName="Priority"
AllowedBinaryFilters="Equals"
FilterPopupMode="List"/>

DevExpress WPF中文教程图集

启用Votes列过滤

允许用户按Votes列过滤GridControl行,如下所示:

1. 将ColumnBase.AllowedBinaryFilters属性设置为GreaterOrEqual,来以允许用户显示投票值大于或等于输入值的行。

2. 将ColumnBase.FilterPopupMode属性设置为Excel,来启用允许用户创建GreaterOrEqual标准的下拉过滤器。

XML

<dxg:GridColumn FieldName="Votes"
AllowedBinaryFilters="GreaterOrEqual"
FilterPopupMode="Excel"/>

DevExpress WPF中文教程图集

启用已创建Date列过滤

允许用户按Created Date(创建日期)列过滤GridControl行,如下所示:

1. 将ColumnBase.AllowedDateTimeFilters属性设置为SingleDateRange,来允许用户按单个日期或日期范围过滤行。

2. 将ColumnBase.FilterPopupMode属性设置为DateSmart,来启用允许用户指定日期的日历。

XML

<dxg:GridColumn FieldName="Created"
AllowedDateTimeFilters="SingleDateRange"
FilterPopupMode="DateSmart"/>

DevExpress WPF中文教程图集

http://www.dtcms.com/a/523518.html

相关文章:

  • UniApp缓存系统详解
  • 【LLM】用 FastAPI 搭建「OpenAI 兼容」DeepSeek-OCR 服务 + 简洁WebUI
  • 企业内部SRE/DevOps向精通Linux课程培训大纲
  • 《Effective Java》第13条:谨慎的覆盖clone
  • 第一章、React + TypeScript + Webpack项目构建
  • 前端:金丝雀部署(Canary Deployment)/ A、B部署 / 灰度部署
  • Spark微博舆情分析系统 情感分析 爬虫 Hadoop和Hive 贴吧数据 双平台 讲解视频 大数据 Hadoop ✅
  • 宁波公司网站建设价格dw建设手机网站
  • 长沙做网站价格有哪些网站可以做青旅义工
  • 怎么查看网站打开速度企业网站用vps还是虚拟主机
  • Vue3 模板引用——ref
  • XGBoost完整学习指南:从数据清洗到模型调参
  • 【深度学习新浪潮】AI Agent工具流产品:从原理到落地,打造智能协作新范式
  • 页面滚动加载更多
  • 除了provide和inject,Vue3还有哪些用于组件通信的方式?
  • React 表单与事件
  • AI代码开发宝库系列:FAISS向量数据库
  • 前端埋点学习
  • Spring AI与DeepSeek实战:打造企业级知识库+系统API调用
  • 秦皇岛市建设局网站关于装配式专家做运动特卖的网站
  • j2ee 建设简单网站设计婚纱网站
  • C++类和对象(中):const 成员函数与取地址运算符重载
  • 数据结构 散列表—— 冲突解决方法
  • 箭头函数和普通函数有什么区别
  • Spring Boot 缓存知识体系大纲
  • 破局政务数字化核心难题:金仓数据库以国产化方案引领电子证照系统升级之路
  • XML:从基础到 Schema 约束的全方位解析
  • 技术引领场景革新|合合信息PRCV论坛聚焦多模态文本智能前沿实践
  • 海南网站建设网络货运平台有哪些
  • 系统架构设计师备考第53天——业务逻辑层设计