/// <summary> /// Creates a relay binding between the two given elements using the properties and converters /// detailed in the supplied bindingProperties. /// </summary> private static void CreateRelayBinding(FrameworkElement targetElement, FrameworkElement sourceElement, BindingProperties bindingProperties) { var sourcePropertyName = bindingProperties.SourceProperty + "Property"; var targetPropertyName = bindingProperties.TargetProperty + "Property"; // find the source dependency property var sourceFields = sourceElement.GetType().GetFields(dpFlags); var sourceDependencyPropertyField = sourceFields.First(i => i.Name == sourcePropertyName); var sourceDependencyProperty = sourceDependencyPropertyField.GetValue(null) as DependencyProperty; // find the target dependency property var targetFields = targetElement.GetType().GetFields(dpFlags); var targetDependencyPropertyField = targetFields.First(i => i.Name == targetPropertyName); var targetDependencyProperty = targetDependencyPropertyField.GetValue(null) as DependencyProperty; ValueObject relayObject; var relayObjectBoundToSource = false; // create a key that identifies this source binding var key = new RelayBindingKey { dependencyObject = sourceDependencyProperty, frameworkElement = sourceElement }; // do we already have a binding to this property? if (relayBindings.ContainsKey(key)) { relayObject = relayBindings[key]; relayObjectBoundToSource = true; } else { // create a relay binding between the two elements relayObject = new ValueObject(); } // initialise the relay object with the source dependency property value if (sourceDependencyProperty != null) relayObject.Value = sourceElement.GetValue(sourceDependencyProperty); // create the binding for our target element to the relay object, this binding will // include the value converter var targetToRelay = new Binding { Source = relayObject, Path = new PropertyPath("Value"), Mode = BindingMode.TwoWay, Converter = bindingProperties.Converter, ConverterParameter = bindingProperties.ConverterParameter }; // set the binding on our target element if (targetDependencyProperty != null) targetElement.SetBinding(targetDependencyProperty, targetToRelay); if (relayObjectBoundToSource) return; // create the binding for our source element to the relay object var sourceToRelay = new Binding { Source = relayObject, Path = new PropertyPath("Value"), Mode = BindingMode.TwoWay }; // set the binding on our source element if (sourceDependencyProperty != null) sourceElement.SetBinding(sourceDependencyProperty, sourceToRelay); relayBindings.Add(key, relayObject); }
/// <summary> /// Sets a binding to a given Dependency Object /// </summary> /// <param name="obj"></param> /// <param name="value"></param> public static void SetBinding(DependencyObject obj, BindingProperties value) { obj.SetValue(BindingProperty, value); }