Пользовательские редакторы¶
PropertyGrid
поддерживает встроенные редакторы в ячейках. Они используются для отображения и редактирования значений ячеек. Вы можете встраивать пользовательские редакторы в ячейки, заменяя таким образом редакторы по умолчанию.
Используйте следующие подходы для определения пользовательских редакторов:
- Назначить редактор непосредственно для определенной строки
- Динамически назначать редакторы строкам на основе типа данных нижележащего объекта строки
Назначьте редактор непосредственно ячейке строки¶
Используйте свойство PropertyGridRow.CellTemplate
, чтобы назначить редактор определенной строке. Для выполнения этой задачи выполните следующие действия:
- Создайте объект DataTemplate с редактором, определенным внутри шаблона.
- Присвойте свойству DataTemplate значение
PropertyGridRow.CellTemplate
. - При необходимости явно привяжите редактор к привязанному полю строки.
В следующем примере показан XAML-код, который инициализирует свойство CellTemplate
:
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>
Неявная привязка данных для редакторов Eremex¶
Если вы используете редактор Eremex внутри шаблона, вы можете опустить явную привязку данных к привязанному полю строки для редактора. Убедитесь, что в редакторе Eremex для свойства x:Name
установлено значение "PART_Editor". В этом случае PropertyGrid автоматически привязывает свойство редактора EditorValue
к полю строки. Кроме того, PropertyGrid начинает поддерживать свойства внешнего вида встроенного редактора (видимость границ и цвет отображаемого текста в активном и неактивном состояниях).
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>
Явная привязка данных¶
Явная привязка данных требуется в следующих случаях:
- Вы используете редактор, который не является редактором 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="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>
Используйте следующий подход, если у вас есть список объектов 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>
Смотрите также¶
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.