A cross-platform UI framework for .NET
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

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;
}
}
}