StyledPropertyMetadata`1.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System;
  2. using Avalonia.Data;
  3. namespace Avalonia
  4. {
  5. /// <summary>
  6. /// Metadata for styled avalonia properties.
  7. /// </summary>
  8. public class StyledPropertyMetadata<TValue> : AvaloniaPropertyMetadata, IStyledPropertyMetadata
  9. {
  10. private Optional<TValue> _defaultValue;
  11. /// <summary>
  12. /// Initializes a new instance of the <see cref="StyledPropertyMetadata{TValue}"/> class.
  13. /// </summary>
  14. /// <param name="defaultValue">The default value of the property.</param>
  15. /// <param name="defaultBindingMode">The default binding mode.</param>
  16. /// <param name="coerce">A value coercion callback.</param>
  17. /// <param name="enableDataValidation">Whether the property is interested in data validation.</param>
  18. public StyledPropertyMetadata(
  19. Optional<TValue> defaultValue = default,
  20. BindingMode defaultBindingMode = BindingMode.Default,
  21. Func<AvaloniaObject, TValue, TValue>? coerce = null,
  22. bool enableDataValidation = false)
  23. : base(defaultBindingMode, enableDataValidation)
  24. {
  25. _defaultValue = defaultValue;
  26. CoerceValue = coerce;
  27. }
  28. /// <summary>
  29. /// Gets the default value for the property.
  30. /// </summary>
  31. public TValue DefaultValue => _defaultValue.GetValueOrDefault()!;
  32. /// <summary>
  33. /// Gets the value coercion callback, if any.
  34. /// </summary>
  35. public Func<AvaloniaObject, TValue, TValue>? CoerceValue { get; private set; }
  36. object? IStyledPropertyMetadata.DefaultValue => DefaultValue;
  37. /// <inheritdoc/>
  38. public override void Merge(AvaloniaPropertyMetadata baseMetadata, AvaloniaProperty property)
  39. {
  40. base.Merge(baseMetadata, property);
  41. if (baseMetadata is StyledPropertyMetadata<TValue> src)
  42. {
  43. if (!_defaultValue.HasValue)
  44. {
  45. _defaultValue = src.DefaultValue;
  46. }
  47. if (CoerceValue == null)
  48. {
  49. CoerceValue = src.CoerceValue;
  50. }
  51. }
  52. }
  53. public override AvaloniaPropertyMetadata GenerateTypeSafeMetadata() => new StyledPropertyMetadata<TValue>(DefaultValue, DefaultBindingMode, enableDataValidation: EnableDataValidation ?? false);
  54. }
  55. }