ChildResolver.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System;
  2. using System.Collections.Generic;
  3. #if WinRT
  4. using Windows.UI.Xaml;
  5. #else
  6. using System.Windows;
  7. #endif
  8. namespace Caliburn.Micro
  9. {
  10. /// <summary>
  11. /// Represents a resolver that takes a control and returns it's children
  12. /// </summary>
  13. public class ChildResolver {
  14. private readonly Func<Type, bool> filter;
  15. private readonly Func<DependencyObject, IEnumerable<DependencyObject>> resolver;
  16. /// <summary>
  17. /// Creates the ChildResolver using the given anonymous methods.
  18. /// </summary>
  19. /// <param name="filter">The filter</param>
  20. /// <param name="resolver">The resolver</param>
  21. public ChildResolver(Func<Type, bool> filter, Func<DependencyObject, IEnumerable<DependencyObject>> resolver) {
  22. this.filter = filter;
  23. this.resolver = resolver;
  24. }
  25. /// <summary>
  26. /// Can this resolve appy to the given type.
  27. /// </summary>
  28. /// <param name="type">The visual tree type.</param>
  29. /// <returns>Returns true if this resolver applies.</returns>
  30. public bool CanResolve(Type type) {
  31. return filter(type);
  32. }
  33. /// <summary>
  34. /// The element from the visual tree for the children to resolve.
  35. /// </summary>
  36. /// <param name="obj"></param>
  37. /// <returns></returns>
  38. public IEnumerable<DependencyObject> Resolve(DependencyObject obj) {
  39. return resolver(obj);
  40. }
  41. }
  42. /// <summary>
  43. /// Generic strongly typed child resolver
  44. /// </summary>
  45. /// <typeparam name="T">The type to filter on</typeparam>
  46. public class ChildResolver<T> : ChildResolver where T : DependencyObject {
  47. /// <summary>
  48. /// Creates a
  49. /// </summary>
  50. /// <param name="resolver"></param>
  51. public ChildResolver(Func<T, IEnumerable<DependencyObject>> resolver) : base(
  52. t => typeof(T).IsAssignableFrom(t),
  53. o => resolver((T)o)){
  54. }
  55. }
  56. }