RelativeSource Core ModelRelativeSourceExtension in XAMLRelativeSource in Binding and ReflectionBindingExtensionFindAncestor Patterns (Visual vs Logical Tree)StaticResourceExtension SemanticsResolveByNameExtension SemanticsBinding.TypeResolver and Type Name ResolutionPrimary APIs:
RelativeSourceRelativeSourceModeTreeTypeRelativeSourceExtensionBinding.RelativeSourceReflectionBindingExtension.RelativeSourceReflectionBindingExtension.ConverterCultureStaticResourceExtensionResolveByNameExtensionBinding.TypeResolverKey members:
RelativeSourceExtension()RelativeSourceExtension(RelativeSourceMode mode)RelativeSourceExtension.ModeRelativeSourceExtension.AncestorTypeRelativeSourceExtension.TreeRelativeSourceExtension.AncestorLevelStaticResourceExtension()StaticResourceExtension(object resourceKey)StaticResourceExtension.ResourceKeyResolveByNameExtension(string name)ResolveByNameExtension.NameReference source files:
src/Avalonia.Base/Data/RelativeSource.cssrc/Avalonia.Base/Data/ReflectionBinding.cssrc/Markup/Avalonia.Markup/Data/Binding.cssrc/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cssrc/Markup/Avalonia.Markup.Xaml/MarkupExtensions/RelativeSourceExtension.cssrc/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cssrc/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResolveByNameExtension.csRelativeSource Core ModelRelativeSource describes where binding source values come from relative to the target.
Important options:
RelativeSourceMode.DataContextRelativeSourceMode.TemplatedParentRelativeSourceMode.SelfRelativeSourceMode.FindAncestorAncestor search controls:
AncestorTypeAncestorLevel (1-based)Tree (TreeType.Visual or TreeType.Logical)Notes:
Mode is RelativeSourceMode.FindAncestor.AncestorLevel is 1.Tree is visual-tree lookup unless set to logical.RelativeSourceExtension in XAMLUse RelativeSourceExtension for inline relative-source markup. This is the canonical style used by Avalonia themes and samples.
Core members:
RelativeSourceExtension()RelativeSourceExtension(RelativeSourceMode mode)ModeAncestorTypeTreeAncestorLevelProvideValue(IServiceProvider)Inline example:
<TextBlock xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Text="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" />
Ancestor example (canonical inline syntax):
<TextBlock xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:MyApp.Controls">
<TextBlock.Text>
<Binding Path="Header"
RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=controls:CardHost, AncestorLevel=1, Tree=Visual}" />
</TextBlock.Text>
</TextBlock>
RelativeSource in Binding and ReflectionBindingExtensionTwo common surfaces:
Binding.RelativeSource (Avalonia.Markup.Data.Binding)ReflectionBindingExtension.RelativeSourceReflectionBindingExtension usage is explicit in XAML:
<TextBlock xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Text="{ReflectionBinding RelativeSource={RelativeSource Self}, Path=Tag}" />
Equivalent C# pattern with Binding.RelativeSource:
using Avalonia.Data;
using Avalonia.Markup.Data;
textBlock.Bind(TextBlock.TextProperty, new Binding("Tag")
{
RelativeSource = new RelativeSource(RelativeSourceMode.Self)
});
Culture behavior on reflection path:
ReflectionBindingExtension.ConverterCulture sets converter culture explicitly.FindAncestor Patterns (Visual vs Logical Tree)Use visual tree for template/composition ancestry:
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Border}, AncestorLevel=1, Tree=Visual}, Path=Name}" />
Use logical tree for content/ownership ancestry:
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}, AncestorLevel=1, Tree=Logical}, Path=Title}" />
Rule of thumb:
Tree=Visual for template/visual composition,Tree=Logical when logical ownership is what matters.StaticResourceExtension SemanticsStaticResourceExtension resolves a resource key during markup value provisioning.
Key APIs:
StaticResourceExtensionStaticResourceExtension()StaticResourceExtension(object resourceKey)ResourceKeyProvideValue(IServiceProvider)Example:
<StackPanel xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel.Resources>
<SolidColorBrush x:Key="AccentBrush" Color="#0A84FF" />
</StackPanel.Resources>
<TextBlock Foreground="{StaticResource AccentBrush}" Text="Static resource lookup" />
</StackPanel>
Behavior details:
ResourceKey is an error,AvaloniaProperty.UnsetValue and complete later.Use StaticResource when value is expected to be stable after load. Use DynamicResource for runtime-changing keys.
ResolveByNameExtension SemanticsResolveByNameExtension performs name-scope lookup by string name.
Key APIs:
ResolveByNameExtensionResolveByNameExtension(string name)NameProvideValue(IServiceProvider)Example:
<Grid xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Border x:Name="Host" />
<TextBlock Tag="{ResolveByName Host}" />
</Grid>
Behavior details:
INameScope,null,AvaloniaProperty.UnsetValue and apply value once available.Binding.TypeResolver and Type Name ResolutionBinding.TypeResolver is a function hook for resolving type names used by reflection binding path parsing.
API:
Binding.TypeResolverReflectionBindingExtension sets type-resolution behavior from service provider context when it creates the binding instance.
Use cases:
Most apps should use default resolution and avoid custom TypeResolver unless runtime composition requires it.
Mode=Self, Mode=TemplatedParent, or Mode=FindAncestor deliberately.Tree intentionally for ancestor lookups.
AncestorLevel minimal.
AncestorLevel=1 is the default and usually correct.StaticResource for stable keys.
DynamicResource only when runtime key changes are required.Binding.TypeResolver and reflection markup paths are advanced configuration points.AncestorType and Tree (Visual vs Logical) match actual tree shape.AncestorLevel; it is 1-based and defaults to first match.StaticResource throws not found.
ResourceKey exists in local/app/theme dictionaries at lookup time.null or stays unset.
INameScope and the named element is registered there.Binding.TypeResolver; fallback to default when possible.