Browse Source

No need for virtual/generic methods here now.

pull/13970/head
Steven Kirk 3 years ago
parent
commit
b75f848154
  1. 11
      src/Avalonia.Base/AvaloniaObject.cs
  2. 9
      src/Avalonia.Base/AvaloniaProperty.cs
  3. 2
      src/Avalonia.Base/Data/BindingOperations.cs
  4. 5
      src/Avalonia.Base/DirectPropertyBase.cs
  5. 2
      src/Avalonia.Base/PropertyStore/ImmediateValueFrame.cs
  6. 46
      src/Avalonia.Base/PropertyStore/ValueStore.cs
  7. 5
      src/Avalonia.Base/StyledProperty.cs
  8. 5
      tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs

11
src/Avalonia.Base/AvaloniaObject.cs

@ -414,7 +414,7 @@ namespace Avalonia
/// <param name="property">The property.</param>
/// <param name="binding">The binding.</param>
/// <returns>
/// A disposable which can be used to terminate the binding.
/// The binding expression which represents the binding instance on this object.
/// </returns>
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);
}
/// <summary>
@ -628,13 +628,6 @@ namespace Avalonia
internal ValueStore GetValueStore() => _values;
internal IReadOnlyList<AvaloniaObject>? GetInheritanceChildren() => _inheritanceChildren;
internal IDisposable Bind(
AvaloniaProperty property,
UntypedBindingExpressionBase expression)
{
return property.RouteBind(this, expression);
}
/// <summary>
/// Called to update the validation state for properties for which data validation is
/// enabled.

9
src/Avalonia.Base/AvaloniaProperty.cs

@ -561,15 +561,6 @@ namespace Avalonia
IObservable<object?> source,
BindingPriority priority);
/// <summary>
/// Routes an untyped Bind call to a typed call.
/// </summary>
/// <param name="o">The object instance.</param>
/// <param name="source">The binding source.</param>
internal abstract BindingExpressionBase RouteBind(
AvaloniaObject o,
UntypedBindingExpressionBase source);
/// <summary>
/// Overrides the metadata for the property on the specified type.
/// </summary>

2
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;

5
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);
}
}
}

2
src/Avalonia.Base/PropertyStore/ImmediateValueFrame.cs

@ -15,7 +15,7 @@ namespace Avalonia.PropertyStore
{
}
public IValueEntry AddBinding<T>(UntypedBindingExpressionBase source)
public IValueEntry AddBinding(UntypedBindingExpressionBase source)
{
Add(source);
return source;

46
src/Avalonia.Base/PropertyStore/ValueStore.cs

@ -43,32 +43,43 @@ namespace Avalonia.PropertyStore
ReevaluateEffectiveValues();
}
public BindingExpressionBase AddBinding<T>(
StyledProperty<T> 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<T>(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<T>(DirectPropertyBase<T> property, UntypedBindingExpressionBase source)
{
DisposeExistingLocalValueBinding(property);
_localValueBindings ??= new();
_localValueBindings[property.Id] = source;
source.AttachAndStart(this, Owner, property, BindingPriority.LocalValue);
return source;
}
public IDisposable AddBinding<T>(DirectPropertyBase<T> property, IObservable<BindingValue<T>> source)
{
var observer = new DirectBindingObserver<T>(this, property);

5
src/Avalonia.Base/StyledProperty.cs

@ -228,11 +228,6 @@ namespace Avalonia
return target.Bind<TValue>(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)
{

5
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();

Loading…
Cancel
Save