Table of Contents

Custom Editors

PropertyGrid supports in-place editors in cells. They are used to display and edit cell values. You can embed custom editors in cells, thus replacing default editors.

propertygrid-inplaceeditor

Use the following approaches to specify custom editors:

Assign an Editor to a Row Cell Directly

Use the PropertyGridRow.CellTemplate property to assign an editor to a specific row. Do the following to accomplish this task:

  • Create a DataTemplate object with an editor defined inside the template.
  • Assign the DataTemplate to the PropertyGridRow.CellTemplate property.
  • Bind the editor to the row's bound field explicitly, when required.

The following example shows XAML code that initializes the CellTemplate property:

xmlns:mxpg="https://schemas.eremexcontrols.net/avalonia/propertygrid"
...
<mxpg:PropertyGridControl x:Name="pGrid1" SelectedObject="{Binding}" Grid.Column="1">
    <mxpg:PropertyGridCategoryRow Caption="MyCategory1">
        <mxpg:PropertyGridRow FieldName="Number">
            <mxpg:PropertyGridRow.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Value}"/>
                </DataTemplate>
            </mxpg:PropertyGridRow.CellTemplate>
        </mxpg:PropertyGridRow>
    </mxpg:PropertyGridCategoryRow>
</mxpg:PropertyGridControl>

Implicit Data Binding for Eremex Editors

If you use an Eremex editor inside a template, you may omit explicit data binding to a row's bound field for the editor. Ensure that the Eremex editor has the x:Name property set to "PART_Editor". In this case, PropertyGrid automatically binds the editor's EditorValue property to the row's field. Additionally, PropertyGrid starts to maintain the in-place editor's appearance settings (the borders' visibility and foreground colors in the active and inactive states).

xmlns:mxpg="https://schemas.eremexcontrols.net/avalonia/propertygrid"
xmlns:mxe="https://schemas.eremexcontrols.net/avalonia/editors"
...
<mxpg:PropertyGridRow FieldName="Caption">
    <mxpg:PropertyGridRow.CellTemplate>
        <DataTemplate>
            <mxe:ButtonEditor x:Name="PART_Editor">
                <mxe:ButtonEditor.Buttons>
                    <mxe:ButtonSettings Content="..."/>
                </mxe:ButtonEditor.Buttons>
            </mxe:ButtonEditor>
        </DataTemplate>
    </mxpg:PropertyGridRow.CellTemplate>
</mxpg:PropertyGridRow>

Explicit Data Binding

Explicit data binding is required in the following cases:

  • You use an editor that is not an Eremex editor. Eremex editors all derive from the Eremex.AvaloniaUI.Controls.Editors.BaseEditor class.
  • You need to specify a custom value converter in the data binding expression.
<DataTemplate DataType="pepa:Color">
    <mxe:PopupColorEditor x:Name="PART_Editor" 
     EditorValue="{Binding Value, Converter={ecadpg:EcadColorToAvaloniaColorConverter}}"/>
</DataTemplate>

Dynamically Assign Editors Based on Row Data Type

The PropertyGrid control can automatically assign templates to row cells based on the data type of the row's bound field. Use the PropertyGridControl.CellTemplate property for this purpose.

The following example associates a TextEditor (paints values in green) with rows bound to Integer fields:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:mxpg="https://schemas.eremexcontrols.net/avalonia/propertygrid"
...
<mxpg:PropertyGridControl.CellTemplate>
    <DataTemplate DataType="sys:Int32">
        <mxe:TextEditor x:Name="PART_Editor1" EditorValue="{Binding Value}" Foreground="Green"/>
    </DataTemplate>
</mxpg:PropertyGridControl.CellTemplate>

Use the following approach if you have a list of DataTemplate objects associated with different data types, and want to assign this list to the PropertyGrid control:

  • Create a custom class in code-behind that locates a DataTemplate based on the data type, and creates a control associated with this data type, as follows:
using Avalonia.Collections;
using Avalonia.Controls.Templates;

namespace AvaloniaApplication1.Views;

public class CellTemplateLocator : AvaloniaList<IDataTemplate>, IDataTemplate
{
    public Control Build(object? param)
    {
        return this.First(x => x.Match(param)).Build(param);
    }

    public bool Match(object? data)
    {
        return this.Any(x => x.Match(data));
    }
}
Tip

The data parameter of the Match method specifies a target cell template's value. The data parameter's contains the bound property's value by default. You can handle the CustomCellTemplateData event to supply a custom object as the cell template's value. The specified custom object will be passed to the Match method.

  • Initialize the PropertyGridControl.CellTemplate property with a CellTemplateLocator object.
  • Populate the CellTemplateLocator object with DataTemplate objects associated with your data types.

The following example defines two DataTemplate objects associated with the String and Integer data types, respectively.

xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:AvaloniaApplication1.Views"

<mxpg:PropertyGridControl.CellTemplate>
    <local:CellTemplateLocator>
        <DataTemplate DataType="sys:String">
            <mxe:TextEditor x:Name="PART_Editor" EditorValue="{Binding Value}" Foreground="Red"/>
        </DataTemplate>
        <DataTemplate DataType="sys:Int32">
            <mxe:TextEditor x:Name="PART_Editor1" EditorValue="{Binding Value}" Foreground="Green"/>
        </DataTemplate>
    </local:CellTemplateLocator>
</mxpg:PropertyGridControl.CellTemplate>

See Also