LocalValueEntry.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using System.Diagnostics.CodeAnalysis;
  2. using Avalonia.Data;
  3. #nullable enable
  4. namespace Avalonia.PropertyStore
  5. {
  6. /// <summary>
  7. /// Stores a value with local value priority in a <see cref="ValueStore"/> or
  8. /// <see cref="PriorityValue{T}"/>.
  9. /// </summary>
  10. /// <typeparam name="T">The property type.</typeparam>
  11. internal class LocalValueEntry<T> : IValue<T>
  12. {
  13. [AllowNull] private T _value;
  14. public LocalValueEntry([AllowNull] T value) => _value = value;
  15. public BindingPriority Priority => BindingPriority.LocalValue;
  16. Optional<object> IValue.GetValue() => new Optional<object>(_value);
  17. public Optional<T> GetValue(BindingPriority maxPriority)
  18. {
  19. return BindingPriority.LocalValue >= maxPriority ? _value : Optional<T>.Empty;
  20. }
  21. public void SetValue(T value) => _value = value;
  22. public void Start() { }
  23. public void RaiseValueChanged(
  24. IValueSink sink,
  25. IAvaloniaObject owner,
  26. AvaloniaProperty property,
  27. Optional<object> oldValue,
  28. Optional<object> newValue)
  29. {
  30. sink.ValueChanged(new AvaloniaPropertyChangedEventArgs<T>(
  31. owner,
  32. (AvaloniaProperty<T>)property,
  33. oldValue.Cast<T>(),
  34. newValue.Cast<T>(),
  35. BindingPriority.LocalValue));
  36. }
  37. }
  38. }