BasicMarkupExtension.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using Avalonia.Data.Core;
  2. using Avalonia.Markup.Xaml;
  3. using Avalonia.Markup.Xaml.MarkupExtensions;
  4. using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings;
  5. using Gommon;
  6. using System;
  7. // ReSharper disable VirtualMemberNeverOverridden.Global
  8. // ReSharper disable MemberCanBeProtected.Global
  9. // ReSharper disable MemberCanBePrivate.Global
  10. #nullable enable
  11. namespace Ryujinx.Ava.Common.Markup
  12. {
  13. internal abstract class BasicMarkupExtension<T> : MarkupExtension
  14. {
  15. public virtual string Name => "Item";
  16. public virtual Action<object, T?>? Setter => null;
  17. protected abstract T? Value { get; }
  18. protected virtual void ConfigureBindingExtension(CompiledBindingExtension _) { }
  19. private ClrPropertyInfo PropertyInfo =>
  20. new(Name,
  21. _ => Value,
  22. Setter as Action<object, object?>,
  23. typeof(T));
  24. public override object ProvideValue(IServiceProvider serviceProvider)
  25. => new CompiledBindingExtension(
  26. new CompiledBindingPathBuilder()
  27. .Property(PropertyInfo, PropertyInfoAccessorFactory.CreateInpcPropertyAccessor)
  28. .Build()
  29. )
  30. .Apply(ConfigureBindingExtension)
  31. .ProvideValue(serviceProvider);
  32. }
  33. }