diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index afea0ba345..e8f96cb0e4 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -414,7 +414,7 @@ namespace Avalonia /// The property. /// The binding. /// - /// A disposable which can be used to terminate the binding. + /// The binding expression which represents the binding instance on this object. /// public BindingExpressionBase Bind(AvaloniaProperty property, IBinding binding) { @@ -423,7 +423,7 @@ namespace Avalonia if (b.Instance(this, property) is not UntypedBindingExpressionBase expression) throw new NotSupportedException("Binding returned unsupported IBindingExpression."); - return property.RouteBind(this, expression); + return GetValueStore().AddBinding(property, expression); } /// @@ -628,13 +628,6 @@ namespace Avalonia internal ValueStore GetValueStore() => _values; internal IReadOnlyList? GetInheritanceChildren() => _inheritanceChildren; - internal IDisposable Bind( - AvaloniaProperty property, - UntypedBindingExpressionBase expression) - { - return property.RouteBind(this, expression); - } - /// /// Called to update the validation state for properties for which data validation is /// enabled. diff --git a/src/Avalonia.Base/AvaloniaProperty.cs b/src/Avalonia.Base/AvaloniaProperty.cs index 62e8db62d7..a56f3f098c 100644 --- a/src/Avalonia.Base/AvaloniaProperty.cs +++ b/src/Avalonia.Base/AvaloniaProperty.cs @@ -561,15 +561,6 @@ namespace Avalonia IObservable source, BindingPriority priority); - /// - /// Routes an untyped Bind call to a typed call. - /// - /// The object instance. - /// The binding source. - internal abstract BindingExpressionBase RouteBind( - AvaloniaObject o, - UntypedBindingExpressionBase source); - /// /// Overrides the metadata for the property on the specified type. /// diff --git a/src/Avalonia.Base/Data/BindingOperations.cs b/src/Avalonia.Base/Data/BindingOperations.cs index a2194fae1d..23a3f532ac 100644 --- a/src/Avalonia.Base/Data/BindingOperations.cs +++ b/src/Avalonia.Base/Data/BindingOperations.cs @@ -27,7 +27,7 @@ namespace Avalonia.Data if (binding.Expression is { } expression) { - return target.Bind(property, expression); + return target.GetValueStore().AddBinding(property, expression); } var mode = binding.Mode; diff --git a/src/Avalonia.Base/DirectPropertyBase.cs b/src/Avalonia.Base/DirectPropertyBase.cs index 733df0d4a8..64eb4d2615 100644 --- a/src/Avalonia.Base/DirectPropertyBase.cs +++ b/src/Avalonia.Base/DirectPropertyBase.cs @@ -182,10 +182,5 @@ namespace Avalonia { return o.Bind(this, source); } - - internal override BindingExpressionBase RouteBind(AvaloniaObject o, UntypedBindingExpressionBase source) - { - return o.GetValueStore().AddBinding(this, source); - } } } diff --git a/src/Avalonia.Base/PropertyStore/ImmediateValueFrame.cs b/src/Avalonia.Base/PropertyStore/ImmediateValueFrame.cs index 36d5a9a39e..600be54372 100644 --- a/src/Avalonia.Base/PropertyStore/ImmediateValueFrame.cs +++ b/src/Avalonia.Base/PropertyStore/ImmediateValueFrame.cs @@ -15,7 +15,7 @@ namespace Avalonia.PropertyStore { } - public IValueEntry AddBinding(UntypedBindingExpressionBase source) + public IValueEntry AddBinding(UntypedBindingExpressionBase source) { Add(source); return source; diff --git a/src/Avalonia.Base/PropertyStore/ValueStore.cs b/src/Avalonia.Base/PropertyStore/ValueStore.cs index 4bca74b1b6..e8f358cb7f 100644 --- a/src/Avalonia.Base/PropertyStore/ValueStore.cs +++ b/src/Avalonia.Base/PropertyStore/ValueStore.cs @@ -43,32 +43,43 @@ namespace Avalonia.PropertyStore ReevaluateEffectiveValues(); } - public BindingExpressionBase AddBinding( - StyledProperty property, + public BindingExpressionBase AddBinding( + AvaloniaProperty property, UntypedBindingExpressionBase source) { - var priority = source.Priority; - - if (priority == BindingPriority.LocalValue) + if (property.IsDirect) { DisposeExistingLocalValueBinding(property); _localValueBindings ??= new(); _localValueBindings[property.Id] = source; - source.AttachAndStart(this, Owner, property, priority); + source.AttachAndStart(this, Owner, property, BindingPriority.LocalValue); return source; } else { - var effective = GetEffectiveValue(property); - var frame = GetOrCreateImmediateValueFrame(property, priority, out _); + var priority = source.Priority; + + if (priority == BindingPriority.LocalValue) + { + DisposeExistingLocalValueBinding(property); + _localValueBindings ??= new(); + _localValueBindings[property.Id] = source; + source.AttachAndStart(this, Owner, property, priority); + return source; + } + else + { + var effective = GetEffectiveValue(property); + var frame = GetOrCreateImmediateValueFrame(property, priority, out _); - source.Attach(this, Owner, property, priority); - frame.AddBinding(source); + source.Attach(this, Owner, property, priority); + frame.AddBinding(source); - if (effective is null || priority <= effective.Priority) - source.Start(); + if (effective is null || priority <= effective.Priority) + source.Start(); - return source; + return source; + } } } @@ -156,15 +167,6 @@ namespace Avalonia.PropertyStore } } - public BindingExpressionBase AddBinding(DirectPropertyBase property, UntypedBindingExpressionBase source) - { - DisposeExistingLocalValueBinding(property); - _localValueBindings ??= new(); - _localValueBindings[property.Id] = source; - source.AttachAndStart(this, Owner, property, BindingPriority.LocalValue); - return source; - } - public IDisposable AddBinding(DirectPropertyBase property, IObservable> source) { var observer = new DirectBindingObserver(this, property); diff --git a/src/Avalonia.Base/StyledProperty.cs b/src/Avalonia.Base/StyledProperty.cs index 8fdc62f361..df12b7099d 100644 --- a/src/Avalonia.Base/StyledProperty.cs +++ b/src/Avalonia.Base/StyledProperty.cs @@ -228,11 +228,6 @@ namespace Avalonia return target.Bind(this, source, priority); } - internal override BindingExpressionBase RouteBind(AvaloniaObject o, UntypedBindingExpressionBase source) - { - return o.GetValueStore().AddBinding(this, source); - } - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConversionSupressWarningMessage)] private bool ShouldSetValue(AvaloniaObject target, object? value, [NotNullWhen(true)] out TValue? converted) { diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs index fcdbcf9704..d23151ca15 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs @@ -175,11 +175,6 @@ namespace Avalonia.Base.UnitTests throw new NotImplementedException(); } - internal override BindingExpressionBase RouteBind(AvaloniaObject o, UntypedBindingExpressionBase source) - { - throw new NotImplementedException(); - } - internal override void RouteClearValue(AvaloniaObject o) { throw new NotImplementedException();