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. 使用以下技术当中的一个向未绑定列填充数据:
- 指定一个计算列值的表达式(ColumnBase.UnboundExpression),表达式部分描述了支持的语法。
- 处理GridControl.CustomUnboundColumnData/TreeListView.CustomUnboundColumnData事件来指定未绑定的列值。
XAML
<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#
grid.Columns.Add(new DevExpress.Xpf.Grid.GridColumn() {
FieldName = "Total",
UnboundDataType = typeof(decimal),
UnboundExpression = "[Quantity] * [UnitPrice]"
});
VB.NET
grid.Columns.Add(New DevExpress.Xpf.Grid.GridColumn() With {
.FieldName = "Total",
.UnboundDataType = GetType(Decimal),
.UnboundExpression = "[Quantity] * [UnitPrice]"
})
您也可以使用GridControl.CustomUnboundColumnDataCommand/TreeListView.CustomUnboundColumnDataCommand属性来维护一个干净的MVVM模式,并在ViewModel中填充未绑定的列。
XAML
<dxg:GridControl ItemsSource="{Binding Items}"
CustomUnboundColumnDataCommand="{Binding UnboundColumnDataCommand}">
<!-- ... -->
<dxg:GridColumn FieldName="Total"
UnboundDataType="{x:Type sys:Decimal}"/>
</dxg:GridControl>
C#
[Command]
public void UnboundColumnData(UnboundColumnRowArgs args) {
if(args.IsGetData) {
var item = (Product)args.Item;
args.Value = item.UnitPrice * item.Quantity;
}
}
VB.NET
<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
<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#
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
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