csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.8 KiB
64 lines
1.8 KiB
using System;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Controls.Templates;
|
|
using Avalonia.Data;
|
|
using Avalonia.Data.Core;
|
|
using Avalonia.Markup.Parsers;
|
|
using Avalonia.Markup.Xaml.MarkupExtensions;
|
|
using Avalonia.Metadata;
|
|
|
|
namespace Avalonia.Markup.Xaml.Templates
|
|
{
|
|
public class TreeDataTemplate : ITreeDataTemplate
|
|
{
|
|
[TemplateDataType]
|
|
public Type DataType { get; set; }
|
|
|
|
[Content]
|
|
[TemplateContent]
|
|
public object Content { get; set; }
|
|
|
|
[AssignBinding]
|
|
public BindingBase ItemsSource { get; set; }
|
|
|
|
public bool Match(object data)
|
|
{
|
|
if (DataType == null)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return DataType.IsInstanceOfType(data);
|
|
}
|
|
}
|
|
|
|
public InstancedBinding ItemsSelector(object item)
|
|
{
|
|
if (ItemsSource != null)
|
|
{
|
|
var obs = ItemsSource switch
|
|
{
|
|
Binding reflection => ExpressionObserverBuilder.Build(item, reflection.Path),
|
|
CompiledBindingExtension compiled => new ExpressionObserver(item, compiled.Path.BuildExpression(false)),
|
|
_ => throw new InvalidOperationException("TreeDataTemplate currently only supports Binding and CompiledBindingExtension!")
|
|
};
|
|
|
|
return InstancedBinding.OneWay(obs, BindingPriority.Style);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public IControl Build(object data)
|
|
{
|
|
var visualTreeForItem = TemplateContent.Load(Content)?.Control;
|
|
if (visualTreeForItem != null)
|
|
{
|
|
visualTreeForItem.DataContext = data;
|
|
}
|
|
|
|
return visualTreeForItem;
|
|
}
|
|
}
|
|
}
|
|
|