4 using System.Collections.Generic;
5 using System.ComponentModel;
7 using System.Windows.Interactivity;
9 using SiliconStudio.Core.Extensions;
11 namespace SiliconStudio.Presentation.Core
15 private readonly List<Tuple<DependencyProperty, EventHandler>> handlers =
new List<Tuple<DependencyProperty, EventHandler>>();
16 private readonly Dictionary<DependencyProperty, DependencyPropertyDescriptor> descriptors =
new Dictionary<DependencyProperty, DependencyPropertyDescriptor>();
17 private FrameworkElement frameworkElement;
19 private bool handlerRegistered;
34 if (dependencyObject == null)
throw new ArgumentNullException(
"dependencyObject");
35 if (ReferenceEquals(dependencyObject, frameworkElement))
38 if (frameworkElement != null)
39 throw new InvalidOperationException(
"A dependency object is already attached to this instance of DependencyPropertyWatcher.");
40 frameworkElement = dependencyObject as FrameworkElement;
42 if (frameworkElement == null)
43 throw new ArgumentException(
"The dependency object to attach to the DependencyPropertyWatcher must be a FrameworkElement.");
45 frameworkElement.Loaded += ElementLoaded;
46 frameworkElement.Unloaded += ElementUnloaded;
52 frameworkElement.Loaded -= ElementLoaded;
53 frameworkElement.Unloaded -= ElementUnloaded;
56 frameworkElement = null;
61 handlers.Add(Tuple.Create(property, handler));
62 if (handlerRegistered)
64 AttachHandler(property, handler);
70 handlers.RemoveWhere(x => x.Item1 ==
property && x.Item2 == handler);
71 if (handlerRegistered)
73 DetachHandler(property, handler);
77 private void AttachHandlers()
79 if (!handlerRegistered)
81 foreach (var handler
in handlers)
83 AttachHandler(handler.Item1, handler.Item2);
85 handlerRegistered =
true;
89 private void DetachHandlers()
91 if (handlerRegistered)
93 foreach (var handler
in handlers)
95 DetachHandler(handler.Item1, handler.Item2);
97 handlerRegistered =
false;
101 private void AttachHandler(DependencyProperty property, EventHandler handler)
103 if (property == null)
throw new ArgumentNullException(
"property");
104 if (handler == null)
throw new ArgumentNullException(
"handler");
105 if (frameworkElement == null)
throw new InvalidOperationException(
"A dependency object must be attached in order to register a handler.");
107 DependencyPropertyDescriptor descriptor;
108 if (!descriptors.TryGetValue(property, out descriptor))
110 descriptor = DependencyPropertyDescriptor.FromProperty(property, AssociatedObject.GetType());
111 descriptors.Add(property, descriptor);
113 descriptor.AddValueChanged(AssociatedObject, handler);
116 private void DetachHandler(DependencyProperty property, EventHandler handler)
118 if (property == null)
throw new ArgumentNullException(
"property");
119 if (handler == null)
throw new ArgumentNullException(
"handler");
120 if (frameworkElement == null)
throw new InvalidOperationException(
"A dependency object must be attached in order to unregister a handler.");
122 DependencyPropertyDescriptor descriptor;
123 if (!descriptors.TryGetValue(property, out descriptor))
125 throw new InvalidOperationException(
"No handler was previously registered for this dependency property.");
127 descriptor.RemoveValueChanged(AssociatedObject, handler);
void UnregisterValueChangedHander(DependencyProperty property, EventHandler handler)
void Attach(DependencyObject dependencyObject)
void RegisterValueChangedHandler(DependencyProperty property, EventHandler handler)
DependencyPropertyWatcher()
DependencyPropertyWatcher(FrameworkElement attachTo)