DevExpress WPF中文教程:Grid - 如何创建未绑定列?

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

未绑定列未绑定到数据源中的字段,这些列允许您根据绑定列中的值计算值,或显示来自自定义数据源的数据。

DevExpress WPF GridControl中绑定列和未绑定列的功能是相同的,您可以按照与绑定列相同的方式对未绑定列进行排序、分组、显示摘要和筛选。

获取DevExpress WPF v24.2正式版下载

添加一个未绑定列
  1. 向GridControl.Columns集合添加一个GridColumn对象。

  2. 将UnboundDataType属性设置为列应存储的值的类型,GridControl根据该属性值选择列的默认编辑器。要替换编辑器,请使用ColumnBase.EditSettings属性。

  3. 为ColumnBase.FieldName属性分配一个唯一的字段名,字段名不能与另一列的字段名或数据源字段名相匹配。

  4. 使用以下技术当中的一个向未绑定列填充数据:

XAML

XML 复制代码
<Window ...
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<dxg:GridControl x:Name="grid">
<!-- ... -->
<dxg:GridColumn FieldName="Total"
UnboundDataType="{x:Type sys:Decimal}"
UnboundExpression="[Quantity] * [UnitPrice]"/>
</dxg:GridControl>

C#

cs 复制代码
grid.Columns.Add(new DevExpress.Xpf.Grid.GridColumn() {
FieldName = "Total",
UnboundDataType = typeof(decimal),
UnboundExpression = "[Quantity] * [UnitPrice]"
});

VB.NET

vbnet 复制代码
grid.Columns.Add(New DevExpress.Xpf.Grid.GridColumn() With {
.FieldName = "Total",
.UnboundDataType = GetType(Decimal),
.UnboundExpression = "[Quantity] * [UnitPrice]"
})

您也可以使用GridControl.CustomUnboundColumnDataCommand/TreeListView.CustomUnboundColumnDataCommand属性来维护一个干净的MVVM模式,并在ViewModel中填充未绑定的列。

XAML

XML 复制代码
<dxg:GridControl ItemsSource="{Binding Items}"
CustomUnboundColumnDataCommand="{Binding UnboundColumnDataCommand}">
<!-- ... -->
<dxg:GridColumn FieldName="Total"
UnboundDataType="{x:Type sys:Decimal}"/>
</dxg:GridControl>

C#

cs 复制代码
[Command]
public void UnboundColumnData(UnboundColumnRowArgs args) {
if(args.IsGetData) {
var item = (Product)args.Item;
args.Value = item.UnitPrice * item.Quantity;
}
}

VB.NET

vbnet 复制代码
<Command>
Public Sub UnboundColumnData(ByVal args As UnboundColumnRowArgs)
If args.IsGetData Then
Dim item = CType(args.Item, Product)
args.Value = item.UnitPrice * item.Quantity
End If
End Sub
编辑未绑定列数据

在大多数情况下,未绑定列的数据是从自定义数据源获取的,或者根据绑定列的值计算。

如果从自定义数据源检索未绑定数据,则可以对其进行编辑。在用户更改了未绑定列的值之后,应该将该值保存回网格的数据源。要为未绑定列提供数据并将任何更改保存到自定义数据源,请处理GridControl.CustomUnboundColumnData 事件。请注意,此事件仅针对未绑定的列引发。

显示未绑定数据

事件参数的ColumnDataEventArgsBase.IsGetData属性返回true,将为每个数据行引发事件,从而允许指定未绑定列的值。网格数据源中被处理的行索引由GridColumnDataEventArgs.ListSourceRowIndex属性返回,应该给ColumnDataEventArgsBase.Value属性分配一个值。

保存更改

事件参数的ColumnDataEventArgsBase.IsSetData属性返回true,ColumnDataEventArgsBase.Value属性包含应该保存到自定义数据源的修改后的单元格值。

下面的代码示例使用Dictionary创建一个可编辑的未绑定列:

XAML

XML 复制代码
<dxg:GridControl Name="grid" AutoGenerateColumns="AddNew" EnableSmartColumnsGeneration="True"
ItemsSource="{Binding List}"
CustomUnboundColumnData="grid_CustomUnboundColumnData">
<dxg:GridControl.Columns>
<dxg:GridColumn FieldName="MyUnboundColumn" UnboundDataType="{x:Type sys:String}"/>
<!-- ... -->
</dxg:GridControl.Columns>
</dxg:GridControl>

C#

cs 复制代码
Dictionary<int, string> unboundData = new Dictionary<int, string>();
unboundData[0] = "MyText";
//...

private void grid_CustomUnboundColumnData(object sender, GridColumnDataEventArgs e) {
if (e.Column.FieldName == "MyUnboundColumn") {
// Populate columns
if (e.IsGetData) {
if (unboundData.ContainsKey(e.ListSourceRowIndex))
e.Value = unboundData[e.ListSourceRowIndex];
}
// Post edited values to the underlying data source
if (e.IsSetData && e.Value != null) {
unboundData[e.ListSourceRowIndex] = e.Value.ToString();
}
}
}

VB.NET

vbnet 复制代码
Dictionary<int, string> unboundData = new Dictionary<int, string>();
unboundData[0] = "MyText";
' ...

Private Sub grid_CustomUnboundColumnData(ByVal sender As Object, ByVal e As GridColumnDataEventArgs)
If e.Column.FieldName = "MyUnboundColumn" Then
' Populate columns
If e.IsGetData Then
If unboundData.ContainsKey(e.ListSourceRowIndex) Then e.Value = unboundData(e.ListSourceRowIndex)
End If
' Post edited values to the underlying data source
If e.IsSetData AndAlso e.Value IsNot Nothing Then
unboundData(e.ListSourceRowIndex) = e.Value.ToString()
End If
End If
End Sub
相关推荐
做个文艺程序员1 天前
MQ第12篇:AI原生消息架构演进:从MQ到事件驱动的全链路设计
架构·消息队列·wpf·事件驱动架构·ai-native·cqrs
donk13143 天前
React Native for OpenHarmony 实战:三方库 react-native-circular-action-menu 的鸿蒙化适配指南
javascript·分布式·react native·react.js·wpf·harmonyos
donk13144 天前
React Native for OpenHarmony 实战:三方库 react-native-step-indicator 的鸿蒙化适配指南
分布式·react native·react.js·wpf·harmonyos
He BianGu4 天前
【笔记】WPF中RenderOptions类的详细功能
笔记·wpf
VidDown4 天前
上线三个月后的第一次事故:一个 Django 服务的日志、监控与故障复盘
数据库·python·django·wpf·音视频·视频编解码
He BianGu4 天前
【笔记】WPF中CachingHint的功能
笔记·wpf
He BianGu4 天前
【笔记】在WPF中BitmapScalingMode的作用
笔记·wpf
Vae_Mars5 天前
幂等性学习笔记
笔记·学习·wpf
samble6 天前
从零搭建灌装监控系统(十九):单元测试实战,xUnit + 内存SQLite + 反射测试私有方法
c#·wpf·mvvm·modbus·工业控制
光泽雨7 天前
路由概念和路由事件 继承链路 RadioButton的事件解析
wpf