/// <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);
 }