using System; using System.Diagnostics.CodeAnalysis; using Avalonia.Data; namespace Avalonia.PropertyStore { /// /// Represents an untyped interface to . /// internal interface IConstantValueEntry : IPriorityValueEntry, IDisposable { } /// /// Stores a value with a priority in a or /// . /// /// The property type. internal class ConstantValueEntry : IPriorityValueEntry, IConstantValueEntry { private ValueOwner _sink; private Optional _value; public ConstantValueEntry( StyledPropertyBase property, T value, BindingPriority priority, ValueOwner sink) { Property = property; _value = value; Priority = priority; _sink = sink; } public ConstantValueEntry( StyledPropertyBase property, Optional value, BindingPriority priority, ValueOwner sink) { Property = property; _value = value; Priority = priority; _sink = sink; } public StyledPropertyBase Property { get; } public BindingPriority Priority { get; private set; } Optional IValue.GetValue() => _value.ToObject(); public Optional GetValue(BindingPriority maxPriority = BindingPriority.Animation) { return Priority >= maxPriority ? _value : Optional.Empty; } public void Dispose() { var oldValue = _value; _value = default; Priority = BindingPriority.Unset; _sink.Completed(Property, this, oldValue); } public void Reparent(PriorityValue sink) => _sink = new(sink); public void Start() { } public void RaiseValueChanged( AvaloniaObject owner, AvaloniaProperty property, Optional oldValue, Optional newValue) { owner.ValueChanged(new AvaloniaPropertyChangedEventArgs( owner, (AvaloniaProperty)property, oldValue.Cast(), newValue.Cast(), Priority)); } } }