Несвязанные столбцы (TreeList)
Если вам нужно отобразить пользовательскую информацию в столбце TreeList, вы можете создать несвязанный столбец. Этот столбец не привязан к полю в нижележащем источнике данных. Вы должны заполнить этот столбец данными вручную, используя событие TreeListControl.CustomUnboundColumnData
.
Чтобы создать несвязанный столбец, выполните следующие действия:
- Создайте объект
TreeListColumn
. - Установите для свойства
UnboundDataType
столбца значение типа данных, которые этот столбец предназначен для отображения. - Установите для свойства
FieldName
столбца значение уникального имени поля. - Добавьте столбец в коллекцию
TreeListControl.Columns
, используя методAdd
илиInsert
. Вы также можете расположить столбец в позиции со свойствомTreeListColumn.VisibleIndex
.
Обратите внимание, что контрол не хранит и не кэширует данные для несвязанных столбцов. Он вызывает событие CustomUnboundColumnData
, которое вам нужно обработать, чтобы указать данные для несвязанных столбцов.
Событие CustomUnboundColumnData
срабатывает в двух случаях:
Когда TreeList необходимо отобразить значение ячейки в несвязанном столбце. В этом случае параметр события
IsGettingData
возвращает значениеtrue
. Вам нужно присвоить значение параметру событияValue
.Когда пользователь изменяет данные в ячейках несвязанных столбцов. В этом случае параметр события
IsGettingData
возвращает значениеfalse
. Прочитайте параметр событияValue
и вручную кэшируйте его в своем хранилище для дальнейшего использования.
Пример 1
В следующем примере создается несвязанный столбец Total, доступный только для чтения, и обрабатывается событие CustomUnboundColumnData для вычисления значений столбца на основе значений других полей в соответствии с выражением: Total=UnitPrice*Количество. Обработчик событий проверяет параметр события IsGettingData
и извлекает значения, если этот параметр равен true
.
xmlns:mxtl="clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls"
xmlns:sys="clr-namespace:System;assembly=System.Runtime"
...
<mxtl:TreeListControl Grid.Column="5" Width="400" Name="treeList1"
CustomUnboundColumnData="treeList1_CustomUnboundColumnData" >
<mxtl:TreeListControl.Columns>
<mxtl:TreeListColumn Name="colUnitPrice" FieldName="UnitPrice" Header="Unit Price" Width="*" />
<mxtl:TreeListColumn Name="colQuantity" FieldName="Quantity" Header="Quantity" Width="*"/>
<mxtl:TreeListColumn Name="colTotal" FieldName="Total" Header="Total" Width="*" ReadOnly="True" UnboundDataType="{x:Type sys:Decimal}" />
</mxtl:TreeListControl.Columns>
</mxtl:TreeListControl>
List<PurchaseRecord> list = new List<PurchaseRecord>();
list.Add(new PurchaseRecord() { UnitPrice = 1.3m, Quantity = 2 });
list.Add(new PurchaseRecord() { UnitPrice = 4m, Quantity = 1 });
list.Add(new PurchaseRecord() { UnitPrice = 10m, Quantity = 20 });
list.Add(new PurchaseRecord() { UnitPrice = 7m, Quantity = 12 });
treeList1.ItemsSource = list;
private void treeList1_CustomUnboundColumnData(object? sender, TreeListUnboundColumnDataEventArgs e)
{
if (e.IsGettingData && e.Column.FieldName == "Total")
{
PurchaseRecord rec = e.Node.Content as PurchaseRecord;
if (rec != null)
{
e.Value = rec.Quantity * rec.UnitPrice;
}
}
}
public partial class PurchaseRecord : ObservableObject
{
[ObservableProperty]
decimal unitPrice;
[ObservableProperty]
int quantity;
}
Пример 2
В следующем примере показано, как можно кэшировать данные, введенные пользователями, в несвязанных столбцах. В примере создается столбец Data и обрабатывается событие CustomUnboundColumnData
, чтобы предоставить данные в TreeList и сохранить данные, введенные пользователями.
treeList1.Columns.Add(new TreeListColumn() { FieldName = "UserData", UnboundDataType = typeof(string), Header = "Data" });
treeList1.CustomUnboundColumnData += treeList1_CustomUnboundColumnData;
Dictionary<int, string> cache = new Dictionary<int, string>();
private void treeList1_CustomUnboundColumnData(object? sender, TreeListUnboundColumnDataEventArgs e)
{
if (e.Column.FieldName != "UserData") return;
if (e.IsGettingData)
{
if (cache.ContainsKey(e.Node.Id))
e.Value = cache[e.Node.Id];
else
e.Value = cache[e.Node.Id] = "-empty-";
}
else
{
cache[e.Node.Id] = e.Value.ToString();
}
}
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.