Page tree
Skip to end of metadata
Go to start of metadata

如果您之前使用过任意一种Microsoft data grid控件(WinForms,Silverlight,或者WPF平台),您可能知道您需要创建自定义的Column对象,覆盖若干方法并且通过代码添加自定义列至grid以完成任何的重大自定义过程。这是一个不坏的方法(Silverlight以及WPF版本的DataGrid控件均遵循这个模型,主要目的是和Microsoft grid保持兼容性)。
但C1FlexGrid控件使用了一种非常不同的方法。

 通过代码自定义单元格:CellFactory 类

grid具有一个CellFactory类,用来创建显示在grid上的每一个单元格。为创建自定义单元格,则可以创建一个类继承自ICellFactory接口,并指定该类型至Grid的CellFactory属性。
和自定义列相似,自定义ICellFactory类可以是高度专业化以及面向应用程序的,也可以是通用的,可重复使用,可
自定义的类。通常,自定义ICellFactory类比自定义列简单的多,因为它将直接处理单元格(而自定义列,与之相反,需要处理列本身以及单元格和其他一些包含在列中的对象)。
ICellFactory 接口看起来像这样:

C#

public interface ICellFactory
{
FrameworkElement CreateCell(
C1FlexGrid grid,
CellType cellType,
CellRange range);
FrameworkElement CreateCellEditor(
C1FlexGrid grid,
CellType cellType,
CellRange range)
void DisposeCell(
C1FlexGrid grid,
CellType cellType,
FrameworkElement cell);
}
第一个方法,CreateCell,将创建一个表示单元格的FrameworkElement对象。这些参数包括:拥有该单元格的grid,待创建的单元格类型,以及表示的CellRange。CellType参数指定是否即将创建的单元格是一个普通的数据单元格还是一个行头或者列头,再或者是位于左上角或者右下角的固定单元格。
第二个方法,CreateCellEditor,和第一个方法的功能类似,不过它将用来创建位于编辑态的单元格。
最后一个方法,DisposeCell,将在单元格从grid中移除时调用。用作为调用者提供一个时机释放关联到该单元格对象的资源。
当使用自定义单元格时,最重要的一点是要理解grid的单元格是临时性存在的。当用户滚动,排序或者在单元格上选择一个范围时,单元格将持续不断地创建 及销毁。这个过程被称为虚拟化,在Silverlight和WPF应用中相当普遍。如果没有虚拟化,grid通常需要同时创建几千个可视元素,这将破坏性能。
实现自定义的ICellFactory类相当容易,因为您可以从C1FlexGrid包含的默认的CellFactory类派生。默认的
CellFacgtory类被设计为可扩展的,因此您可以让其处理单元格创建的具体步骤,仅需要自定义您需要的逻辑部分。 iTunes的示例(在线文档)和金融应用程序示例是Grid使用自定义ICellFactory类实现功能的示例。这些示例是该文
档中包含的MainTestApplication的一部分,每一个示例都包含了Silverlight以及WPF版本。本文档中的描述将集中在关键的实现点。关于详情,请参阅示例应用程序源代码。

 在XAML中自定义单元格:CellTemplate 以及CellEditingTemplate

如果您希望通过XAML,而不是代码,创建自定义单元格,您也可以实现。C1FlexGrid Column对象具有
CellTemplate以及CellEditingTemplate属性,您可以用来指定列上的显示模式/编辑模式的单元格使用的不同的可视化元素。
例如,下面的XAML代码定义自定义的视觉元素,用于显示和编辑列中的值。在该列中的单元格显示为一个绿色,粗体,文本居中对齐,并通过一个具有一个编辑图标的文本框进行编辑:

XAML

<c1:C1FlexGrid x:Name="_fgTemplated">
<c1:C1FlexGrid.Columns>
<!-- 添加模版列-->
<c1:Column ColumnName="_colTemplated" Header="Template" Width="200">
<!-- 显示模式下单元格的模版 -->
<c1:Column.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"
Foreground="Green" FontWeight="Bold"
VerticalAlignment="Center"/>
</DataTemplate>
</c1:Column.CellTemplate>
<!-- 编辑模式下的单元格模版-->
<c1:Column.CellEditingTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Source="edit_icon.png" Grid.Column="0" />
<TextBox Text="{Binding Name, Mode=TwoWay}" Grid.Column="1" />
</Grid>
</DataTemplate>
</c1:Column.CellEditingTemplate>
</c1:Column>
</c1:C1FlexGrid.Columns>
</c1:C1FlexGrid>

  • No labels