Skip to main content
A newer version of this page is available. .
Tag

ColumnBase.CellTemplateSelector Property

Gets or sets an object that chooses a cell template based on custom logic. This is a dependency property.

Namespace: DevExpress.Xpf.Grid

Assembly: DevExpress.Xpf.Grid.v19.1.Core.dll

Declaration

public DataTemplateSelector CellTemplateSelector { get; set; }

Property Value

Type Description
DataTemplateSelector

A DataTemplateSelector descendant that chooses a template based on custom logic.

Remarks

Tip

A template that defines the presentation of data cells is specified by the ColumnBase.CellTemplate property. If you have more than one template that can be used to render cells, you can implement custom logic to choose the required template. To do this, derive from the DataTemplateSelector class, implement the SelectTemplate method that returns a template which meets the required condition, and assign it to the CellTemplateSelector property.

If both the ColumnBase.CellTemplate and CellTemplateSelector are specified, a cell is rendered using the template returned by the template selector. If the template selector returns null, the template specified by the ColumnBase.CellTemplate property is used.

This sample illustrates how to change a cell template based on a condition using the CellTemplateSelector.

To implement this approach, do the following:

  1. Implement custom DataTemplates. Editors declared in these templates should follow our recommendations from this help topic: ColumnBase.CellTemplate:

    <Window.Resources>
        <DataTemplate x:Key="booleanEditor">
            <dxe:CheckEdit Name="PART_Editor" />
        </DataTemplate>
        <DataTemplate x:Key="buttonEditor">
            <dxe:ButtonEdit Name="PART_Editor" />
        </DataTemplate>
        <DataTemplate x:Key="comboboxEditor">
            <dxe:ComboBoxEdit Name="PART_Editor">
                <dxe:ComboBoxEdit.ItemsSource>
                    <collections:ArrayList>
                        <dx:Alignment>Near</dx:Alignment>
                        <dx:Alignment>Center</dx:Alignment>
                        <dx:Alignment>Far</dx:Alignment>
                    </collections:ArrayList>
                </dxe:ComboBoxEdit.ItemsSource>
            </dxe:ComboBoxEdit>
        </DataTemplate>
        <DataTemplate x:Key="dateEditor">
            <dxe:DateEdit Name="PART_Editor" />
        </DataTemplate>
        <DataTemplate x:Key="textEditor">
            <dxe:TextEdit Name="PART_Editor" />
        </DataTemplate>
    </Window.Resources>
    
    <dxg:GridControl Name="grid">
        <dxg:GridControl.Columns>
            <dxg:GridColumn FieldName="Editor" />
            <dxg:GridColumn FieldName="Value">
                <dxg:GridColumn.CellTemplateSelector>
                    <local:EditorTemplateSelector />
                </dxg:GridColumn.CellTemplateSelector>
            </dxg:GridColumn>
        </dxg:GridControl.Columns>
        <dxg:GridControl.View>
            <dxg:TableView Name="view" AutoWidth="True" EditorButtonShowMode="ShowAlways" />
        </dxg:GridControl.View>
    </dxg:GridControl> 
    
  2. Create a custom DataTemplateSelector descendant. This descendant should return templates according to your scenario requirements.

    Note

    Each GridControl cell contains an object of the EditGridCellData data type in its DataContext. This object’s RowData.Row property contains your data item. You can use this property if your logic should take property values from data items into account:

    public class EditorTemplateSelector : DataTemplateSelector {
        public override DataTemplate SelectTemplate(object item, DependencyObject container) {
            GridCellData data = (GridCellData)item;
            var dataItem = data.RowData.Row as TestData;
            return string.IsNullOrEmpty(dataItem.Editor) ? null : (DataTemplate)((FrameworkElement)container).FindResource(dataItem.Editor);
        }
    } 
    

The following code snippet (auto-collected from DevExpress Examples) contains a reference to the CellTemplateSelector property.

Note

The algorithm used to collect these code examples remains a work in progress. Accordingly, the links and snippets below may produce inaccurate results. If you encounter an issue with code examples below, please use the feedback form on this page to report the issue.

See Also