From 7b00f34df85c9c103d7e22f4068c855a6fd5777a Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 17 Nov 2022 02:23:16 -0500 Subject: [PATCH 1/2] Fix template parent compiled bindings with "!" in the beginning --- .../CompiledBindings/CompiledBindingPath.cs | 5 +++-- .../MarkupExtensions/CompiledBindingExtensionTests.cs | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CompiledBindingPath.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CompiledBindingPath.cs index f78d4867ff..a49a7a36d4 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CompiledBindingPath.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CompiledBindingPath.cs @@ -75,8 +75,9 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings } internal IEnumerable Elements => _elements; - - internal SourceMode SourceMode => _elements.Count > 0 && _elements[0] is IControlSourceBindingPathElement ? SourceMode.Control : SourceMode.Data; + + internal SourceMode SourceMode => _elements.OfType().Any() + ? SourceMode.Control : SourceMode.Data; internal object RawSource { get; } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs index 77067fa517..9f178672ac 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs @@ -734,12 +734,12 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions { var xaml = @" + Focusable='True'> @@ -747,10 +747,11 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions "; var contentControl = AvaloniaRuntimeXamlLoader.Parse(xaml); + contentControl.DataContext = new TestDataContext(); // should be ignored contentControl.Measure(new Size(10, 10)); var result = contentControl.GetTemplateChildren().OfType().First(); - Assert.Equal("Hello", result.Content); + Assert.Equal(false, result.Focusable); } } @@ -781,6 +782,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions "; var textBox = AvaloniaRuntimeXamlLoader.Parse(xaml); + textBox.DataContext = new TestDataContext(); // should be ignored textBox.Measure(new Size(10, 10)); var result = textBox.GetTemplateChildren().OfType().First(); From c111b235f75d4c3ad1d99f58f1b98a0229ba166d Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 17 Nov 2022 00:29:12 -0500 Subject: [PATCH 2/2] Fix static property getter/setter --- .../XamlIlClrPropertyInfoHelper.cs | 21 +++++++++------- .../CompiledBindingExtensionTests.cs | 25 ++++++++++++++++++- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlClrPropertyInfoHelper.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlClrPropertyInfoHelper.cs index e76e2cd46e..affd3aa42b 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlClrPropertyInfoHelper.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlClrPropertyInfoHelper.cs @@ -59,14 +59,17 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions var field = _builder.DefineField(types.IPropertyInfo, name + "!Field", false, true); - void Load(IXamlMethod m, IXamlILEmitter cg) + void Load(IXamlMethod m, IXamlILEmitter cg, bool passThis) { - cg - .Ldarg_0(); - if (m.DeclaringType.IsValueType) - cg.Unbox(m.DeclaringType); - else - cg.Castclass(m.DeclaringType); + if (passThis) + { + cg + .Ldarg_0(); + if (m.DeclaringType.IsValueType) + cg.Unbox(m.DeclaringType); + else + cg.Castclass(m.DeclaringType); + } foreach (var indexerArg in indexerArguments) { @@ -80,7 +83,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions new[] {types.XamlIlTypes.Object}, name + "!Getter", false, true, false); if (getter != null) { - Load(property.Getter, getter.Generator); + Load(property.Getter, getter.Generator, !property.Getter.IsStatic); getter.Generator.EmitCall(property.Getter); if (property.Getter.ReturnType.IsValueType) @@ -95,7 +98,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions name + "!Setter", false, true, false); if (setter != null) { - Load(property.Setter, setter.Generator); + Load(property.Setter, setter.Generator, !property.Getter.IsStatic); setter.Generator.Ldarg(1); if (property.Setter.Parameters[0].IsValueType) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs index 9f178672ac..2d7dcf4b45 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs @@ -139,6 +139,27 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions } } + + [Fact] + public void ResolvesStaticClrPropertyBased() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = @" + + +"; + var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); + var textBlock = window.FindControl("textBlock"); + textBlock.DataContext = new TestDataContext(); + + Assert.Equal(TestDataContext.StaticProperty, textBlock.Text); + } + } + [Fact] public void ResolvesDataTypeFromBindingProperty() { @@ -1716,7 +1737,9 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions string IHasExplicitProperty.ExplicitProperty => "Hello"; - public string ExplicitProperty => "Bye"; + public string ExplicitProperty => "Bye"; + + public static string StaticProperty => "World"; public class NonIntegerIndexer : NotifyingBase, INonIntegerIndexerDerived {