BindingBehavior.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System.Reactive.Disposables;
  2. using Avalonia.Controls;
  3. using Avalonia.Data;
  4. namespace Avalonia.Xaml.Interactions.Custom;
  5. /// <summary>
  6. ///
  7. /// </summary>
  8. public class BindingBehavior : AttachedToVisualTreeBehavior<Control>
  9. {
  10. /// <summary>
  11. ///
  12. /// </summary>
  13. public static readonly StyledProperty<AvaloniaProperty?> TargetPropertyProperty =
  14. AvaloniaProperty.Register<BindingBehavior, AvaloniaProperty?>(nameof(TargetProperty));
  15. /// <summary>
  16. ///
  17. /// </summary>
  18. public static readonly StyledProperty<AvaloniaObject?> TargetObjectProperty =
  19. AvaloniaProperty.Register<BindingBehavior, AvaloniaObject?>(nameof(TargetObject));
  20. /// <summary>
  21. ///
  22. /// </summary>
  23. public static readonly StyledProperty<IBinding?> BindingProperty =
  24. AvaloniaProperty.Register<BindingBehavior, IBinding?>(nameof(Binding));
  25. /// <summary>
  26. ///
  27. /// </summary>
  28. public AvaloniaProperty? TargetProperty
  29. {
  30. get => GetValue(TargetPropertyProperty);
  31. set => SetValue(TargetPropertyProperty, value);
  32. }
  33. /// <summary>
  34. ///
  35. /// </summary>
  36. [ResolveByName]
  37. public AvaloniaObject? TargetObject
  38. {
  39. get => GetValue(TargetObjectProperty);
  40. set => SetValue(TargetObjectProperty, value);
  41. }
  42. /// <summary>
  43. ///
  44. /// </summary>
  45. [AssignBinding]
  46. public IBinding? Binding
  47. {
  48. get => GetValue(BindingProperty);
  49. set => SetValue(BindingProperty, value);
  50. }
  51. /// <summary>
  52. ///
  53. /// </summary>
  54. /// <param name="disposable"></param>
  55. protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
  56. {
  57. if (TargetObject is not null && TargetProperty is not null && Binding is not null)
  58. {
  59. var dispose = TargetObject.Bind(TargetProperty, Binding);
  60. disposable.Add(dispose);
  61. }
  62. }
  63. }