diff --git a/src/Avalonia.Base/AvaloniaPropertyChangedEventArgs.cs b/src/Avalonia.Base/AvaloniaPropertyChangedEventArgs.cs index c2bb1e9b01..3d04fe74f1 100644 --- a/src/Avalonia.Base/AvaloniaPropertyChangedEventArgs.cs +++ b/src/Avalonia.Base/AvaloniaPropertyChangedEventArgs.cs @@ -27,11 +27,6 @@ namespace Avalonia IsEffectiveValueChange = isEffectiveValueChange; } - internal void SetSender(AvaloniaObject sender) - { - Sender = sender; - } - /// /// Gets the that the property changed on. /// @@ -65,6 +60,16 @@ namespace Avalonia public BindingPriority Priority { get; private set; } internal bool IsEffectiveValueChange { get; private set; } + + /// + /// Sets the Sender property. + /// This is purely for reuse in some code paths where multiple allocations may occur. + /// + /// The sender object. + internal void SetSender(AvaloniaObject sender) + { + Sender = sender; + } protected abstract AvaloniaProperty GetProperty(); protected abstract object? GetOldValue(); diff --git a/src/Avalonia.Base/PropertyStore/ValueStore.cs b/src/Avalonia.Base/PropertyStore/ValueStore.cs index 7c458d176b..1af99366e7 100644 --- a/src/Avalonia.Base/PropertyStore/ValueStore.cs +++ b/src/Avalonia.Base/PropertyStore/ValueStore.cs @@ -592,11 +592,12 @@ namespace Avalonia.PropertyStore var count = children.Count; - var args = GetPropertyChangedEventArgs(Owner, property, oldValue, value.Value); + var apArgs = new AvaloniaPropertyChangedEventArgs(Owner, property, oldValue, value.Value, BindingPriority.Inherited, true); + var incpArgs = new PropertyChangedEventArgs(property.Name); for (var i = 0; i < count; ++i) { - children[i].GetValueStore().OnAncestorInheritedValueChanged(args.apArgs, args.incpArgs); + children[i].GetValueStore().OnAncestorInheritedValueChanged(apArgs, incpArgs); } } @@ -616,12 +617,13 @@ namespace Avalonia.PropertyStore if (children is not null) { var count = children.Count; - - var args = GetPropertyChangedEventArgs(Owner, property, oldValue, newValue); + + var apArgs = new AvaloniaPropertyChangedEventArgs(Owner, property, oldValue, newValue, BindingPriority.Inherited, true); + var incpArgs = new PropertyChangedEventArgs(property.Name); for (var i = 0; i < count; ++i) { - children[i].GetValueStore().OnAncestorInheritedValueChanged(args.apArgs, args.incpArgs); + children[i].GetValueStore().OnAncestorInheritedValueChanged(apArgs, incpArgs); } } } @@ -644,25 +646,13 @@ namespace Avalonia.PropertyStore } } } - - private (AvaloniaPropertyChangedEventArgs apArgs, PropertyChangedEventArgs? incpArgs) - GetPropertyChangedEventArgs(AvaloniaObject sender, - StyledProperty property, - T oldValue, - T newValue) - { - Debug.Assert(property.Inherits); - - return new (new AvaloniaPropertyChangedEventArgs(sender, property, oldValue, newValue, BindingPriority.Inherited, true), new PropertyChangedEventArgs(property.Name)); - } /// /// Called when an inherited property changes on the value store of the inheritance ancestor. /// /// The property type. - /// The property. - /// The old value of the property. - /// The new value of the property. + /// Avalonia Property EventArgs to reuse. + /// PropertyChangedEventArgs to reuse public void OnAncestorInheritedValueChanged(AvaloniaPropertyChangedEventArgs apArgs, PropertyChangedEventArgs? args) {