diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 4ab813333d..68b9871fd1 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -71,7 +71,8 @@ namespace Avalonia public AvaloniaObject() { VerifyAccess(); - foreach (var property in AvaloniaPropertyRegistry.Instance.GetRegistered(this)) + + void Notify(AvaloniaProperty property) { object value = property.IsDirect ? ((IDirectPropertyAccessor)property).GetValue(this) : @@ -86,6 +87,16 @@ namespace Avalonia property.NotifyInitialized(e); } + + foreach (var property in AvaloniaPropertyRegistry.Instance.GetRegistered(this)) + { + Notify(property); + } + + foreach (var property in AvaloniaPropertyRegistry.Instance.GetRegisteredAttached(this.GetType())) + { + Notify(property); + } } /// diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Attached.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Attached.cs index ab2a2d899d..02600f5e00 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Attached.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Attached.cs @@ -24,10 +24,27 @@ namespace Avalonia.Base.UnitTests Assert.Throws(() => target.SetValue(Class2.FooProperty, "throw")); } - private class Class1 : AvaloniaObject + [Fact] + public void AvaloniaProperty_Initialized_Is_Called_For_Attached_Property() + { + bool raised = false; + + using (Class1.FooProperty.Initialized.Subscribe(x => raised = true)) + { + new Class3(); + } + + Assert.True(raised); + } + + private class Base : AvaloniaObject + { + } + + private class Class1 : Base { public static readonly AttachedProperty FooProperty = - AvaloniaProperty.RegisterAttached( + AvaloniaProperty.RegisterAttached( "Foo", "foodefault", validate: ValidateFoo); @@ -43,10 +60,14 @@ namespace Avalonia.Base.UnitTests } } - private class Class2 : AvaloniaObject + private class Class2 : Base { public static readonly AttachedProperty FooProperty = Class1.FooProperty.AddOwner(); } + + private class Class3 : Base + { + } } }