From 39b3c72c3f220ab1e5227e456ad654aa5d200313 Mon Sep 17 00:00:00 2001 From: Colton Date: Wed, 27 Aug 2025 14:10:14 -0400 Subject: [PATCH] Fixes duplicate class property registration (#19558) * Fix ClassBindingManager property dictionary insert * Prepend ClassPropertyPrefix to key when inserting into registered properties dictionary to be consistent with lookup. * Added ClassBindingManager unit tests --- src/Avalonia.Base/ClassBindingManager.cs | 11 +++++---- .../ClassBindingManagerTests.cs | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 tests/Avalonia.Base.UnitTests/ClassBindingManagerTests.cs diff --git a/src/Avalonia.Base/ClassBindingManager.cs b/src/Avalonia.Base/ClassBindingManager.cs index 8632f16aa9..35b5bc8863 100644 --- a/src/Avalonia.Base/ClassBindingManager.cs +++ b/src/Avalonia.Base/ClassBindingManager.cs @@ -33,10 +33,13 @@ namespace Avalonia } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] - public static AvaloniaProperty GetClassProperty(string className) => - s_RegisteredProperties.TryGetValue(ClassPropertyPrefix + className, out var property) - ? property - : s_RegisteredProperties[className] = RegisterClassProxyProperty(className); + public static AvaloniaProperty GetClassProperty(string className) + { + var prefixedClassName = ClassPropertyPrefix + className; + return s_RegisteredProperties.TryGetValue(prefixedClassName, out var property) + ? property + : s_RegisteredProperties[prefixedClassName] = RegisterClassProxyProperty(className); + } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] public static bool IsClassesBindingProperty(AvaloniaProperty property, [NotNullWhen(true)] out string? classPropertyName) diff --git a/tests/Avalonia.Base.UnitTests/ClassBindingManagerTests.cs b/tests/Avalonia.Base.UnitTests/ClassBindingManagerTests.cs new file mode 100644 index 0000000000..23f9882ba9 --- /dev/null +++ b/tests/Avalonia.Base.UnitTests/ClassBindingManagerTests.cs @@ -0,0 +1,24 @@ +using Xunit; + +namespace Avalonia.Base.UnitTests +{ + public class ClassBindingManagerTests + { + + [Fact] + public void GetClassProperty_Should_Return_Same_Instance_For_Same_Class() + { + var property1 = ClassBindingManager.GetClassProperty("Foo"); + var property2 = ClassBindingManager.GetClassProperty("Foo"); + Assert.Same(property1, property2); + } + + [Fact] + public void GetClassProperty_Should_Return_Different_Instances_For_Different_Classes() + { + var property1 = ClassBindingManager.GetClassProperty("Foo"); + var property2 = ClassBindingManager.GetClassProperty("Bar"); + Assert.NotSame(property1, property2); + } + } +}