using System; using System.Diagnostics.CodeAnalysis; using Avalonia.Data; #nullable enable 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 IValueSink _sink; private Optional _value; public ConstantValueEntry( StyledPropertyBase property, [AllowNull] T value, BindingPriority priority, IValueSink 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(IValueSink sink) => _sink = sink; public void Start() { } public void RaiseValueChanged( IValueSink sink, IAvaloniaObject owner, AvaloniaProperty property, Optional oldValue, Optional newValue) { sink.ValueChanged(new AvaloniaPropertyChangedEventArgs( owner, (AvaloniaProperty)property, oldValue.GetValueOrDefault(), newValue.GetValueOrDefault(), Priority)); } } }