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
相关推荐
玖笙&3 天前
✨WPF编程基础【2.1】布局原则
c++·wpf·visual studio
玖笙&3 天前
✨WPF编程基础【2.2】:布局面板实战
c++·wpf·visual studio
SEO-狼术3 天前
.NET WPF 数据编辑器集合提供列表框控件
.net·wpf
FuckPatience7 天前
WPF 具有跨线程功能的UI元素
wpf
诗仙&李白7 天前
HEFrame.WpfUI :一个现代化的 开源 WPF UI库
ui·开源·wpf
He BianGu7 天前
【笔记】在WPF中Binding里的详细功能介绍
笔记·wpf
He BianGu7 天前
【笔记】在WPF中 BulletDecorator 的功能、使用方式并对比 HeaderedContentControl 与常见 Panel 布局的区别
笔记·wpf
123梦野8 天前
WPF——效果和可视化对象
wpf
He BianGu8 天前
【笔记】在WPF中Decorator是什么以及何时优先考虑 Decorator 派生类
笔记·wpf
时光追逐者9 天前
一款专门为 WPF 打造的开源 Office 风格用户界面控件库
ui·开源·c#·.net·wpf