diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlBindingPathTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlBindingPathTransformer.cs index fa697972e9..cba82a9408 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlBindingPathTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlBindingPathTransformer.cs @@ -123,7 +123,12 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers }; var selfType = context.ParentNodes().OfType().First().Type.GetClrType(); - + + if (context.GetAvaloniaTypes().MultiBinding.IsAssignableFrom(selfType)) + { + selfType = context.ParentNodes().OfType().Skip(1).First().Type.GetClrType(); + } + // When using self bindings with setters we need to change target type to resolved selector type. if (context.GetAvaloniaTypes().SetterBase.IsAssignableFrom(selfType)) { diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs index 9f46bccd90..1b26f6c899 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs @@ -21,6 +21,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public IXamlMethod AvaloniaObjectSetStyledPropertyValue { get; } public IXamlType AvaloniaAttachedPropertyT { get; } public IXamlType IBinding { get; } + public IXamlType MultiBinding { get; } public IXamlMethod AvaloniaObjectBindMethod { get; } public IXamlMethod AvaloniaObjectSetValueMethod { get; } public IXamlType IDisposable { get; } @@ -140,6 +141,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers && m.Parameters[0].Name == "StyledProperty`1" && m.Parameters[2].Equals(BindingPriority)); IBinding = cfg.TypeSystem.GetType("Avalonia.Data.IBinding"); + MultiBinding = cfg.TypeSystem.GetType("Avalonia.Data.MultiBinding"); IDisposable = cfg.TypeSystem.GetType("System.IDisposable"); ICommand = cfg.TypeSystem.GetType("System.Windows.Input.ICommand"); Transitions = cfg.TypeSystem.GetType("Avalonia.Animation.Transitions"); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs index 905b3456d6..7e25215f70 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs @@ -1692,6 +1692,74 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions } } + [Theory] + [InlineData(false)] + [InlineData(true)] + public void Binds_To_RelativeSource_Self_In_MultiBinding(bool compileBindings) + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = $@" + + + + + + + + + + + +"; + var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); + var textBlock = window.GetControl("textBlock"); + + var dataContext = new TestDataContext(); + window.DataContext = dataContext; + + Assert.Equal(" $self = Normal, $parent = Vertical" + , textBlock.GetValue(TextBlock.TextProperty)); + } + } + + [Theory] + [InlineData(false)] + [InlineData(true)] + public void Binds_To_RelativeSource_Self_In_MultiBinding_In_Style(bool compileBindings) + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = $@" + + + + + + + +"; + var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); + var textBlock = window.GetControl("textBlock"); + + var dataContext = new TestDataContext(); + window.DataContext = dataContext; + + Assert.Equal(" $self = Normal" + , textBlock.GetValue(TextBlock.TextProperty)); + } + } + [Fact] public void SupportsMethodBindingAsDelegate() {