From 0179666a8980108dbd532b32c42c9d461f1cc9c4 Mon Sep 17 00:00:00 2001 From: Johan Appelgren Date: Wed, 6 Mar 2024 20:09:03 +0100 Subject: [PATCH] Fix parsing type cast of attached property. (#14838) --- .../Parsers/BindingExpressionGrammar.cs | 4 +++- ...onObserverBuilderTests_AttachedProperty.cs | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs b/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs index 5a4a56b746..179ba009c0 100644 --- a/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs +++ b/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs @@ -257,8 +257,10 @@ namespace Avalonia.Markup.Parsers } result = ParseBeforeMember(ref r, nodes); + if (result == State.AttachedProperty) + result = ParseAttachedProperty(ref r, nodes); - if(r.Peek == '[') + if (r.Peek == '[') { result = ParseIndexer(ref r, nodes); } diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs index 4c9333c42b..cc2dc35f0b 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs +++ b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs @@ -65,6 +65,22 @@ namespace Avalonia.Markup.UnitTests.Parsers Assert.Null(((IAvaloniaObjectDebug)data).GetPropertyChangedSubscribers()); } + [Fact] + public async Task Should_Get_Chained_Attached_Property_Value_With_TypeCast() + { + var expected = new Class1(); + + var data = new Class1(); + data.SetValue(Owner.SomethingProperty, new Class1() { Next = expected }); + + var target = Build(data, "((Class1)(Owner.Something)).Next", typeResolver: (ns, name) => name == "Class1" ? typeof(Class1) : _typeResolver(ns, name)); + var result = await target.Take(1); + + Assert.Equal(expected, result); + + Assert.Null(((IAvaloniaObjectDebug)data).GetPropertyChangedSubscribers()); + } + [Fact] public void Should_Track_Simple_Attached_Value() { @@ -159,6 +175,11 @@ namespace Avalonia.Markup.UnitTests.Parsers "Foo", typeof(Owner), defaultValue: "foo"); + + public static readonly AttachedProperty SomethingProperty = + AvaloniaProperty.RegisterAttached( + "Something", + typeof(Owner)); } private class Class1 : AvaloniaObject