AvaloniaPropertyChangedObservable.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using System;
  2. namespace Avalonia.Reactive
  3. {
  4. internal class AvaloniaPropertyChangedObservable :
  5. LightweightObservableBase<AvaloniaPropertyChangedEventArgs>,
  6. IDescription
  7. {
  8. private readonly WeakReference<IAvaloniaObject> _target;
  9. private readonly AvaloniaProperty _property;
  10. public AvaloniaPropertyChangedObservable(
  11. IAvaloniaObject target,
  12. AvaloniaProperty property)
  13. {
  14. _target = new WeakReference<IAvaloniaObject>(target);
  15. _property = property;
  16. }
  17. public string Description => $"{_target.GetType().Name}.{_property.Name}";
  18. protected override void Initialize()
  19. {
  20. if (_target.TryGetTarget(out var target))
  21. {
  22. target.PropertyChanged += PropertyChanged;
  23. }
  24. }
  25. protected override void Deinitialize()
  26. {
  27. if (_target.TryGetTarget(out var target))
  28. {
  29. target.PropertyChanged -= PropertyChanged;
  30. }
  31. }
  32. private void PropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
  33. {
  34. if (e.Property == _property)
  35. {
  36. PublishNext(e);
  37. }
  38. }
  39. }
  40. }