Модификации таблицы-представления, получаемой в результате работы расширения типа "Таблица в представлении".
Модификации таблицы-представления, получаемой в результате работы расширения типа “Таблица в представлении”.¶
Данный элемент управления является наследником класса CardViewControlViewModel
. Его тип: CardTableViewControlViewModel
.
Рассмотрим возможные сценарии модификации данного элемента управления.
- Модификация строк при создании.
Если требуется модифицировать строки таблицы при их создании, то необходимо добавить функцию в список CardViewControlViewModel.ModifyRowActions
. Данную функцию необходимо задать на этапе инициализации карточки, так как если сделать это в ICardUIExtension.Initialized
, то если контрол представления находится на выбранное вкладке, то первое обновление представления (создание строк) произойдет раньше выполнения ICardUIExtension.Initialized
. Во время выполнения ICardUIExtension.Initializing
контролы еще не созданы, поэтому используем ICardModel.ControlInitializers
- список функций, которые выполняется для каждого контрола сразу после его создания. Используя ICardModel.ControlInitializers
можно модифицировать контролы, которые отображаются в редакторе строки таблицы. Пример:
using System.Threading.Tasks;
using System.Windows.Media;
using Tessa.UI;
using Tessa.UI.Cards;
using Tessa.UI.Cards.Controls;
public sealed class ExampleUIExtension : CardUIExtension
{
public override async Task Initializing(ICardUIExtensionContext context)
{
var model = context.Model;
model.ControlInitializers.Add(async (control, m, r, ct) =>
{
if (control is CardViewControlViewModel viewControl)
{
if (viewControl.Name == "Алиас контрола представления")
{
viewControl.ModifyRowActions.Add(row =>
{
// Изменим цвет.
row.Background = Brushes.Blue;
// Добавим тэг.
// Имя колонки - ее порядок (в строковом формате) в редакторе колонок таблицы.
// В данном примере тэг добавляется к первой строке представления.
row.CellsByColumnName["0"].AddLeftTag(
"Названия тэга, чтобы его в будущем можно было найти",
new IconViewModel("Иконка, например, Thin42", row.MenuContext.Icons),
visible: true,
toolTip: "Строка с подсказкой");
});
}
}
});
}
}
- Модификация строк при их изменении.
Если требуется изменить строку таблицы при изменении строки основной секции или строки дочерней секций, от которой зависит строка таблицы, то следует подписаться на событие CardTableViewControlViewModel.RowChanged
. Гарантируется, что EventHandler сработает в UI потоке. Пример:
using System;
using System.Threading.Tasks;
using System.Windows.Media;
using Tessa.Platform.Storage;
using Tessa.UI;
using Tessa.UI.Cards;
using Tessa.Extensions.Platform.Client.UI.TableViewExtension;
public sealed class ExampleUIExtension : CardUIExtension
{
public override async Task Initialized(ICardUIExtensionContext context)
{
if (!context.Model.Controls.TryGet("YourViewControlAlias", out var controlViewModel))
{
throw new ArgumentException($"Control ViewModel with Name='{"YourViewControlAlias"}' not found.");
}
var tableControl = controlViewModel as CardTableViewControlViewModel;
tableControl.RowChanged += OnRowChanged;
}
private void OnRowChanged(object sender, TableViewRowChangedEventArgs e)
{
if(e.ChangeType == TableViewRowChangeType.RowChanged)
{
if(e.ChangedFieldName == "Какое-то поле" &&
e.CardRow.TryGet<bool?>(e.ChangedFieldName) == true)
{
e.Row.Background = Brushes.Red;
}
}
}
}
- События, возникающие при добавлении, модификации или удалении строки, закрытии или валидации формы аналогичны событиям в
GridViewModel
(контролТаблица
).