diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 22aeccc3fb..99e27e7daf 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -466,7 +466,7 @@ namespace Avalonia /// The old property value. /// The new property value. /// The priority of the binding that produced the value. - protected void RaisePropertyChanged( + protected internal void RaisePropertyChanged( AvaloniaProperty property, object oldValue, object newValue, @@ -569,44 +569,6 @@ namespace Avalonia => SetAndRaiseCore(property, ref backing, val, notifyWrapper), value); } - - /// - /// Default setter handler that will set backing field and raise notification. - /// - private sealed class DefaultSetterHandler : DeferredSetterOptimized.ISetterHandler - { - public static readonly DefaultSetterHandler Instance = new DefaultSetterHandler(); - - public bool Update(AvaloniaObject source, AvaloniaProperty property, ref T backing, T value) - { - var old = backing; - backing = value; - - source.RaisePropertyChanged(property, old, value); - - return true; - } - } - - /// - /// Setter handler that will run custom user callback. - /// - private sealed class CallbackSetterHandler : DeferredSetterOptimized.ISetterHandler - { - private readonly SetAndRaiseCallback _callback; - - public CallbackSetterHandler(SetAndRaiseCallback callback) - { - _callback = callback; - } - - public bool Update(AvaloniaObject source, AvaloniaProperty property, ref T backing, T value) - { - _callback(value, ref backing, notification => notification()); - - return true; - } - } protected bool SetAndRaiseOptimized(AvaloniaProperty property, ref T field, T value) { @@ -619,39 +581,21 @@ namespace Avalonia DeferredSetterOptimized setter = Values.GetDeferredSetter(property); - return setter.SetAndNotify(this, property, DefaultSetterHandler.Instance, ref field, value); - } - - protected bool SetAndRaiseOptimized( - AvaloniaProperty property, - ref T field, - SetAndRaiseCallback setterCallback, - T value) - { - VerifyAccess(); - - if (EqualityComparer.Default.Equals(field, value)) - { - return false; - } - - DeferredSetterOptimized setter = Values.GetDeferredSetter(property); - - return setter.SetAndNotify(this, property, new CallbackSetterHandler(setterCallback) , ref field, value); + return setter.SetAndNotify(this, property, ref field, value); } /// - /// Default assignment logic for SetAndRaise. - /// - /// The type of the property. - /// The property. - /// The backing field. - /// The value. - /// A wrapper for the property-changed notification. - /// - /// True if the value changed, otherwise false. - /// - private bool SetAndRaiseCore(AvaloniaProperty property, ref T field, T value, Action notifyWrapper) + /// Default assignment logic for SetAndRaise. + /// + /// The type of the property. + /// The property. + /// The backing field. + /// The value. + /// A wrapper for the property-changed notification. + /// + /// True if the value changed, otherwise false. + /// + private bool SetAndRaiseCore(AvaloniaProperty property, ref T field, T value, Action notifyWrapper) { var old = field; field = value; diff --git a/src/Avalonia.Base/Utilities/AvaloniaPropertyCollection.cs b/src/Avalonia.Base/Utilities/AvaloniaPropertyCollection.cs index 5b1492a7a8..9b64342814 100644 --- a/src/Avalonia.Base/Utilities/AvaloniaPropertyCollection.cs +++ b/src/Avalonia.Base/Utilities/AvaloniaPropertyCollection.cs @@ -95,7 +95,7 @@ namespace Avalonia.Utilities return true; } - public void AddValueInternal(AvaloniaProperty property, TValue value) + public void AddValue(AvaloniaProperty property, TValue value) { Entry[] entries = new Entry[_entries.Length + 1]; @@ -117,7 +117,7 @@ namespace Avalonia.Utilities _entries = entries; } - public void SetValueInternal(AvaloniaProperty property, TValue value) + public void SetValue(AvaloniaProperty property, TValue value) { _entries[TryFindEntry(property.Id).Item1].Value = value; } diff --git a/src/Avalonia.Base/Utilities/DeferredSetterOptimized.cs b/src/Avalonia.Base/Utilities/DeferredSetterOptimized.cs index e3bed90498..4858372828 100644 --- a/src/Avalonia.Base/Utilities/DeferredSetterOptimized.cs +++ b/src/Avalonia.Base/Utilities/DeferredSetterOptimized.cs @@ -17,20 +17,26 @@ namespace Avalonia.Utilities _pendingValues = new SingleOrQueue(); } + private static void SetAndRaisePropertyChanged(AvaloniaObject source, AvaloniaProperty property, ref TSetRecord backing, TSetRecord value) + { + var old = backing; + + backing = value; + + source.RaisePropertyChanged(property, old, value); + } + public bool SetAndNotify( AvaloniaObject source, AvaloniaProperty property, - ISetterHandler handler, ref TSetRecord backing, TSetRecord value) { if (!_isNotifying) { - bool updated; - using (new NotifyDisposable(this)) { - updated = handler.Update(source, property, ref backing, value); + SetAndRaisePropertyChanged(source, property, ref backing, value); } if (!_pendingValues.Empty) @@ -39,12 +45,12 @@ namespace Avalonia.Utilities { while (!_pendingValues.Empty) { - updated = handler.Update(source, property, ref backing, _pendingValues.Dequeue()); + SetAndRaisePropertyChanged(source, property, ref backing, _pendingValues.Dequeue()); } } } - return updated; + return true; } _pendingValues.Enqueue(value); @@ -71,14 +77,5 @@ namespace Avalonia.Utilities _setter._isNotifying = false; } } - - public interface ISetterHandler - { - bool Update( - AvaloniaObject source, - AvaloniaProperty property, - ref TSetRecord backing, - TSetRecord value); - } } } diff --git a/src/Avalonia.Base/ValueStore.cs b/src/Avalonia.Base/ValueStore.cs index b2c4c68f9c..b7f5c26801 100644 --- a/src/Avalonia.Base/ValueStore.cs +++ b/src/Avalonia.Base/ValueStore.cs @@ -33,13 +33,13 @@ namespace Avalonia { priorityValue = CreatePriorityValue(property); priorityValue.SetValue(v, (int)BindingPriority.LocalValue); - _propertyValues.SetValueInternal(property, priorityValue); + _propertyValues.SetValue(property, priorityValue); } } else { priorityValue = CreatePriorityValue(property); - _propertyValues.AddValueInternal(property, priorityValue); + _propertyValues.AddValue(property, priorityValue); } return priorityValue.Add(source, (int)priority); @@ -57,7 +57,7 @@ namespace Avalonia { if (priority == (int)BindingPriority.LocalValue) { - _propertyValues.SetValueInternal(property, Validate(property, value)); + _propertyValues.SetValue(property, Validate(property, value)); Changed(property, priority, v, value); return; } @@ -65,7 +65,7 @@ namespace Avalonia { priorityValue = CreatePriorityValue(property); priorityValue.SetValue(v, (int)BindingPriority.LocalValue); - _propertyValues.SetValueInternal(property, priorityValue); + _propertyValues.SetValue(property, priorityValue); } } } @@ -78,14 +78,14 @@ namespace Avalonia if (priority == (int)BindingPriority.LocalValue) { - _propertyValues.AddValueInternal(property, Validate(property, value)); + _propertyValues.AddValue(property, Validate(property, value)); Changed(property, priority, AvaloniaProperty.UnsetValue, value); return; } else { priorityValue = CreatePriorityValue(property); - _propertyValues.AddValueInternal(property, priorityValue); + _propertyValues.AddValue(property, priorityValue); } } @@ -187,7 +187,7 @@ namespace Avalonia var newDeferredSetter = new DeferredSetterOptimized(); - _deferredSetters.AddValueInternal(property, newDeferredSetter); + _deferredSetters.AddValue(property, newDeferredSetter); return newDeferredSetter; } diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj index 6550a23b7b..f503bf66a7 100644 --- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj +++ b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj @@ -18,7 +18,7 @@ - + diff --git a/tests/Avalonia.Benchmarks/Base/DirectPropertyBenchmark.cs b/tests/Avalonia.Benchmarks/Base/DirectPropertyBenchmark.cs index 4f36b54414..ecf8a1fb2b 100644 --- a/tests/Avalonia.Benchmarks/Base/DirectPropertyBenchmark.cs +++ b/tests/Avalonia.Benchmarks/Base/DirectPropertyBenchmark.cs @@ -79,4 +79,4 @@ namespace Avalonia.Benchmarks.Base } } } -} \ No newline at end of file +}