Пользовательские редакторы
PropertyGrid
позволяет встраивать пользовательские редакторы в ячейки. Вы можете назначить редактор непосредственно определенной строке или динамически назначать редакторы строкам на основе типа данных нижележащего объекта строки.
Смотрите следующий раздел для получения информации о редакторах по умолчанию: Редактирование данных .
Назначение редактора непосредственно ячейке строки
Используйте свойство PropertyGridRow.CellTemplate
, чтобы назначить редактор определенной строке. Для выполнения этой задачи выполните следующие действия:
- Создайте объект DataTemplate с редактором, определенным внутри шаблона.
- Присвойте DataTemplate свойству
PropertyGridRow.CellTemplate
. - При необходимости явно привяжите редактор к привязанному полю строки.
В следующем примере показан код XAML, который инициализирует свойство CellTemplate
:
xmlns:mxpg="clr-namespace:Eremex.AvaloniaUI.Controls.PropertyGrid;assembly=Eremex.Avalonia.Controls"
...
<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>
Неявная привязка данных для редакторов Eremex
Если вы используете редактор Eremex внутри шаблона, вы можете опустить явную привязку данных к привязанному полю строки для редактора. Убедитесь, что в редакторе Eremex для свойства x:Name
установлено значение "PART_Editor". В этом случае PropertyGrid автоматически привязывает свойство редактора EditorValue
к полю строки. Кроме того, PropertyGrid начинает поддерживать свойства внешнего вида встроенного редактора (видимость границ и цвет отображаемого текста в активном и неактивном состояниях).
xmlns:mxpg="clr-namespace:Eremex.AvaloniaUI.Controls.PropertyGrid;assembly=Eremex.Avalonia.Controls"
xmlns:mxe="clr-namespace:Eremex.AvaloniaUI.Controls.Editors;assembly=Eremex.Avalonia.Controls"
...
<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>
Явная привязка данных
Явная привязка данных требуется в следующих случаях:
- Вы используете редактор, который не является редактором Eremex. Все редакторы Eremex являются производными от класса
Eremex.AvaloniaUI.Controls.Editors.BaseEditor
. - Вам необходимо указать пользовательский конвертер значений в выражении привязки данных.
<DataTemplate DataType="pepa:Color">
<mxe:PopupColorEditor x:Name="PART_Editor" EditorValue="{Binding Value, Converter={ecadpg:EcadColorToAvaloniaColorConverter}}"/>
</DataTemplate>
Динамическое назначение редакторов на основе типа данных строки
Контрол PropertyGrid может автоматически назначать шаблоны ячейкам строки на основе типа данных привязанного поля строки. Используйте свойство PropertyGridControl.CellTemplate
для этой цели.
Следующий пример привязывает TextEditor (рисует значения зеленым цветом) к строкам, привязанным к целочисленным полям:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:mxpg="clr-namespace:Eremex.AvaloniaUI.Controls.PropertyGrid;assembly=Eremex.Avalonia.Controls"
...
<mxpg:PropertyGridControl.CellTemplate>
<DataTemplate DataType="sys:Int32">
<mxe:TextEditor x:Name="PART_Editor1" EditorValue="{Binding Value}" Foreground="Green"/>
</DataTemplate>
</mxpg:PropertyGridControl.CellTemplate>
Используйте следующий подход, если у вас есть список объектов DataTemplate, связанных с различными типами данных, и вы хотите назначить этот список контролу PropertyGrid.:
- Создайте пользовательский класс в коде, который находит DataTemplate на основе типа данных и создает контрол, связанный с этим типом данных, следующим образом:
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));
}
}
СОВЕТ
Параметр data метода Match
определяет значение целевого шаблона ячейки. Параметр data содержит значение привязанного свойства по умолчанию. Вы можете обработать событие CustomCellTemplateData
, чтобы предоставить пользовательский объект в качестве значения шаблона ячейки. Указанный пользовательский объект будет передан методу Match
.
- Инициализируйте свойство
PropertyGridControl.CellTemplate
объектом CellTemplateLocator. - Заполните объект CellTemplateLocator объектами DataTemplate, связанными с вашими типами данных.
В следующем примере определены два объекта DataTemplate, связанные со строковым и целочисленным типами данных соответственно.
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>
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.