Browse Source

Raised property changed when binding completes.

Fixes #3545
pull/3556/head
Steven Kirk 6 years ago
parent
commit
edc8bece4e
  1. 8
      src/Avalonia.Base/AvaloniaObject.cs
  2. 4
      src/Avalonia.Base/PropertyStore/BindingEntry.cs
  3. 5
      src/Avalonia.Base/PropertyStore/IValueSink.cs
  4. 5
      src/Avalonia.Base/PropertyStore/PriorityValue.cs
  5. 6
      src/Avalonia.Base/ValueStore.cs

8
src/Avalonia.Base/AvaloniaObject.cs

@ -478,7 +478,13 @@ namespace Avalonia
} }
} }
void IValueSink.Completed(AvaloniaProperty property, IPriorityValueEntry entry) { } void IValueSink.Completed<T>(
StyledPropertyBase<T> property,
IPriorityValueEntry entry,
Optional<T> oldValue)
{
((IValueSink)this).ValueChanged(property, BindingPriority.Unset, oldValue, default);
}
/// <summary> /// <summary>
/// Called for each inherited property when the <see cref="InheritanceParent"/> changes. /// Called for each inherited property when the <see cref="InheritanceParent"/> changes.

4
src/Avalonia.Base/PropertyStore/BindingEntry.cs

@ -48,10 +48,10 @@ namespace Avalonia.PropertyStore
{ {
_subscription?.Dispose(); _subscription?.Dispose();
_subscription = null; _subscription = null;
_sink.Completed(Property, this); _sink.Completed(Property, this, Value);
} }
public void OnCompleted() => _sink.Completed(Property, this); public void OnCompleted() => _sink.Completed(Property, this, Value);
public void OnError(Exception error) public void OnError(Exception error)
{ {

5
src/Avalonia.Base/PropertyStore/IValueSink.cs

@ -15,6 +15,9 @@ namespace Avalonia.PropertyStore
Optional<T> oldValue, Optional<T> oldValue,
BindingValue<T> newValue); BindingValue<T> newValue);
void Completed(AvaloniaProperty property, IPriorityValueEntry entry); void Completed<T>(
StyledPropertyBase<T> property,
IPriorityValueEntry entry,
Optional<T> oldValue);
} }
} }

5
src/Avalonia.Base/PropertyStore/PriorityValue.cs

@ -117,7 +117,10 @@ namespace Avalonia.PropertyStore
UpdateEffectiveValue(); UpdateEffectiveValue();
} }
void IValueSink.Completed(AvaloniaProperty property, IPriorityValueEntry entry) void IValueSink.Completed<TValue>(
StyledPropertyBase<TValue> property,
IPriorityValueEntry entry,
Optional<TValue> oldValue)
{ {
_entries.Remove((IPriorityValueEntry<T>)entry); _entries.Remove((IPriorityValueEntry<T>)entry);
UpdateEffectiveValue(); UpdateEffectiveValue();

6
src/Avalonia.Base/ValueStore.cs

@ -190,13 +190,17 @@ namespace Avalonia
_sink.ValueChanged(property, priority, oldValue, newValue); _sink.ValueChanged(property, priority, oldValue, newValue);
} }
void IValueSink.Completed(AvaloniaProperty property, IPriorityValueEntry entry) void IValueSink.Completed<T>(
StyledPropertyBase<T> property,
IPriorityValueEntry entry,
Optional<T> oldValue)
{ {
if (_values.TryGetValue(property, out var slot)) if (_values.TryGetValue(property, out var slot))
{ {
if (slot == entry) if (slot == entry)
{ {
_values.Remove(property); _values.Remove(property);
_sink.Completed(property, entry, oldValue);
} }
} }
} }

Loading…
Cancel
Save