private static void OnVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            FrameworkElement adornedElement = d as FrameworkElement;

            if (adornedElement == null)
            {
                throw new InvalidOperationException("Adorners can only be applied to elements deriving from FrameworkElement");
            }
            AdornerLayer layer = AdornerLayer.GetAdornerLayer(adornedElement);

            if (layer == null)
            {
                throw new InvalidOperationException("Cannot show adorner since no adorner layer was found in the visual tree");
            }

            SmartAdorner adorner = GetAdorner(adornedElement);

            bool isVisible = (bool)e.NewValue;

            if (isVisible && adorner == null)
            {
                adorner = new SmartAdorner(adornedElement);

                SetAdorner(adornedElement, adorner);
                layer.Add(adorner);
            }
            else if (!isVisible && adorner != null)
            {
                layer.Remove(adorner);
                SetAdorner(d, null);
            }
        }
        private static void OnTemplateSelectorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            SmartAdorner adorner = GetAdorner(d);

            if (adorner != null)
            {
                adorner.TemplateSelector = (DataTemplateSelector)e.NewValue;
            }
        }
 private static void SetAdorner(DependencyObject obj, SmartAdorner value)
 {
     obj.SetValue(AdornerProperty, value);
 }