private static void OnDataContextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DescriptionViewer viewer = d as DescriptionViewer;

            if ((viewer != null) && (((e.OldValue == null) || (e.NewValue == null)) || !ReferenceEquals(e.OldValue.GetType(), e.NewValue.GetType())))
            {
                viewer.LoadMetadata(false);
            }
        }
        private static void OnDescriptionPropertyChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
        {
            DescriptionViewer viewer = depObj as DescriptionViewer;

            if (viewer != null)
            {
                viewer.UpdateDescriptionState();
            }
        }
        private static void OnPropertyPathPropertyChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
        {
            DescriptionViewer viewer = depObj as DescriptionViewer;

            if ((viewer != null) && viewer.Initialized)
            {
                viewer.LoadMetadata(false);
                viewer.ParseTargetValidState();
            }
        }
        private static void OnIsValidPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DescriptionViewer viewer = d as DescriptionViewer;

            if ((viewer != null) && !viewer.AreHandlersSuspended())
            {
                viewer.SetValueNoCallback(IsValidProperty, e.OldValue);
                object[] args = new object[] { "IsValid" };
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Properties.Resources.UnderlyingPropertyIsReadOnly, args));
            }
        }
        private static void OnTargetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DescriptionViewer dependencyObject = d as DescriptionViewer;

            if (dependencyObject != null)
            {
                bool flag = false;
                //TODO: review this logic
                //flag = e.NewValue == FocusManager.GetFocusedElement(Window.GetWindow(dependencyObject));
                flag = e.NewValue == FocusManager.GetFocusedElement(dependencyObject);
                if (dependencyObject.IsFocused != flag)
                {
                    dependencyObject.IsFocused = flag;
                }
                dependencyObject.LoadMetadata(false);
                FrameworkElement oldValue = e.OldValue as FrameworkElement;
                FrameworkElement newValue = e.NewValue as FrameworkElement;
                EventHandler <ValidationErrorEventArgs> handler = new EventHandler <ValidationErrorEventArgs>(dependencyObject.Target_BindingValidationError);
                RoutedEventHandler handler2 = new RoutedEventHandler(dependencyObject.Target_GotFocus);
                RoutedEventHandler handler3 = new RoutedEventHandler(dependencyObject.Target_LostFocus);
                if (oldValue != null)
                {
                    //oldValue.BindingValidationError -= handler;
                    oldValue.RemoveHandler(Validation.ErrorEvent, handler);
                    oldValue.GotFocus  -= handler2;
                    oldValue.LostFocus -= handler3;
                }
                if (newValue != null)
                {
                    //newValue.BindingValidationError += handler;
                    newValue.AddHandler(Validation.ErrorEvent, handler);
                    newValue.GotFocus  += handler2;
                    newValue.LostFocus += handler3;
                }
                dependencyObject.ParseTargetValidState();
            }
        }