PerspexObjectExtensions.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // -----------------------------------------------------------------------
  2. // <copyright file="PerspexObjectExtensions.cs" company="Steven Kirk">
  3. // Copyright 2015 MIT Licence. See licence.md for more information.
  4. // </copyright>
  5. // -----------------------------------------------------------------------
  6. namespace Perspex
  7. {
  8. using System;
  9. using System.Reactive.Linq;
  10. /// <summary>
  11. /// Provides extension methods for <see cref="PerspexObject"/> and related classes.
  12. /// </summary>
  13. public static class PerspexObjectExtensions
  14. {
  15. /// <summary>
  16. /// Subscribes to a property changed notifications for changes that originate from a
  17. /// <typeparamref name="TTarget"/>.
  18. /// </summary>
  19. /// <typeparam name="TTarget">The type of the property change sender.</typeparam>
  20. /// <param name="observable">The property changed observable.</param>
  21. /// <param name="action">
  22. /// The method to call. The parameters are the sender and the event args.
  23. /// </param>
  24. /// <returns>A disposable that can be used to terminate the subscription.</returns>
  25. public static IDisposable AddClassHandler<TTarget>(
  26. this IObservable<PerspexPropertyChangedEventArgs> observable,
  27. Action<TTarget, PerspexPropertyChangedEventArgs> action)
  28. where TTarget : PerspexObject
  29. {
  30. return observable.Subscribe(e => action((TTarget)e.Sender, e));
  31. }
  32. /// <summary>
  33. /// Subscribes to a property changed notifications for changes that originate from a
  34. /// <typeparamref name="TTarget"/>.
  35. /// </summary>
  36. /// <typeparam name="TTarget">The type of the property change sender.</typeparam>
  37. /// <param name="observable">The property changed observable.</param>
  38. /// <param name="handler">Given a TTarget, returns the handler.</param>
  39. /// <returns>A disposable that can be used to terminate the subscription.</returns>
  40. public static IDisposable AddClassHandler<TTarget>(
  41. this IObservable<PerspexPropertyChangedEventArgs> observable,
  42. Func<TTarget, Action<PerspexPropertyChangedEventArgs>> handler)
  43. where TTarget : class
  44. {
  45. return observable.Subscribe(e => SubscribeAdapter(e, handler));
  46. }
  47. /// <summary>
  48. /// Observer method for <see cref="AddClassHandler{TTarget}(IObservable{PerspexPropertyChangedEventArgs},
  49. /// Func{TTarget, Action{PerspexPropertyChangedEventArgs}})"/>.
  50. /// </summary>
  51. /// <typeparam name="TTarget">The sender type to accept.</typeparam>
  52. /// <param name="e">The event args.</param>
  53. /// <param name="handler">Given a TTarget, returns the handler.</param>
  54. private static void SubscribeAdapter<TTarget>(
  55. PerspexPropertyChangedEventArgs e,
  56. Func<TTarget, Action<PerspexPropertyChangedEventArgs>> handler)
  57. where TTarget : class
  58. {
  59. var target = e.Sender as TTarget;
  60. if (target != null)
  61. {
  62. handler(target)(e);
  63. }
  64. }
  65. }
  66. }