Parameter.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. namespace Caliburn.Micro {
  2. using System;
  3. using System.ComponentModel;
  4. using System.Windows;
  5. using System.Windows.Interactivity;
  6. /// <summary>
  7. /// Represents a parameter of an <see cref="ActionMessage"/>.
  8. /// </summary>
  9. public class Parameter : Freezable, IAttachedObject {
  10. /// <summary>
  11. /// A dependency property representing the parameter's value.
  12. /// </summary>
  13. public static readonly DependencyProperty ValueProperty =
  14. DependencyProperty.Register(
  15. "Value",
  16. typeof(object),
  17. typeof(Parameter),
  18. new PropertyMetadata(OnValueChanged)
  19. );
  20. DependencyObject associatedObject;
  21. WeakReference owner;
  22. /// <summary>
  23. /// Gets or sets the value of the parameter.
  24. /// </summary>
  25. /// <value>The value.</value>
  26. [Category("Common Properties")]
  27. public object Value {
  28. get { return GetValue(ValueProperty); }
  29. set { SetValue(ValueProperty, value); }
  30. }
  31. DependencyObject IAttachedObject.AssociatedObject {
  32. get
  33. {
  34. ReadPreamble();
  35. return associatedObject;
  36. }
  37. }
  38. /// <summary>
  39. /// Gets or sets the owner.
  40. /// </summary>
  41. protected ActionMessage Owner {
  42. get { return owner == null ? null : owner.Target as ActionMessage; }
  43. set { owner = new WeakReference(value); }
  44. }
  45. void IAttachedObject.Attach(DependencyObject dependencyObject) {
  46. WritePreamble();
  47. associatedObject = dependencyObject;
  48. WritePostscript();
  49. }
  50. void IAttachedObject.Detach() {
  51. WritePreamble();
  52. associatedObject = null;
  53. WritePostscript();
  54. }
  55. /// <summary>
  56. /// When implemented in a derived class, creates a new instance of the <see cref="T:System.Windows.Freezable"/> derived class.
  57. /// </summary>
  58. /// <returns>The new instance.</returns>
  59. protected override Freezable CreateInstanceCore() {
  60. return new Parameter();
  61. }
  62. /// <summary>
  63. /// Makes the parameter aware of the <see cref="ActionMessage"/> that it's attached to.
  64. /// </summary>
  65. /// <param name="owner">The action message.</param>
  66. internal void MakeAwareOf(ActionMessage owner) {
  67. Owner = owner;
  68. }
  69. static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
  70. var parameter = (Parameter)d;
  71. var owner = parameter.Owner;
  72. if (owner != null) {
  73. owner.UpdateAvailability();
  74. }
  75. }
  76. }
  77. }