2012-04-23 4 views
1

Я реализую логическую DependencyProperty, которая добавляет adorner к DependencyObject, если для него установлено значение true. Я хочу, чтобы значение DependencyProperty по умолчанию было истинным, но при этом не запускается PropertyChangedCallback, поэтому по умолчанию создатель не создается. Есть ли способ инициализации объекта PropertyChangedCallback?Увольнение пользовательского свойства DependencyProperty PropertyChangedCallback при инициализации

public static bool GetIsAdorned(DependencyObject obj) 
{ 
    return (bool)obj.GetValue(IsAdornedProperty); 
} 

public static void SetIsAdorned(DependencyObject obj, bool value) 
{ 
    obj.SetValue(IsAdornedProperty, value); 
} 

public static readonly DependencyProperty IsAdornedProperty = 
     DependencyProperty.RegisterAttached("IsAdorned", 
     typeof(bool), 
     typeof(UIElement), 
     new UIPropertyMetadata(true, OnIsAdornedChanged)); 

private static void OnIsAdornedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    var uiElement = dependencyObject as UIElement; 
    var newValue = (bool)e.NewValue; 
    var adornerLayer = AdornerLayer.GetAdornerLayer(uiElement); 

    if (newValue) 
    { 
     adornerLayer.Add(new MyAdorner(uiElement)); 
    } 
} 
+1

Просто примечание: при создании [настраиваемого вложенного свойства] (http://msdn.microsoft.com/en-us/library/ms749011.aspx#custom) параметр * ownerType * в RegisterAttached должен быть классом в котором вы определяете это свойство **, а не ** класс, в котором вы хотите применить свойство (т. е. не UIElement здесь). В противном случае вы не сможете применить свойство в XAML. – Clemens

+0

Я всегда задавался вопросом об этом, так как в примере в документации не отображается класс, определяемый DependencyProperty, поэтому было неясно, к чему был установлен параметр ownerType. Странно, что у меня уже было несколько вариантов поведения: я установил параметр ownerType для класса, к которому я хочу применить свойство, и он не дал мне никаких проблем, и я могу установить свойство в XAML. Мне придется пройти через код и исправить это. Спасибо, Клеменс! –

ответ

2

За исключением прикрепленных свойств, которые поддерживают наследование значений, нет значения по умолчанию, которое автоматически применяется ко всем элементам дерева.

Значение обычного прикрепленного свойства (без наследования) не применяется к любому элементу, если вы явно не задали это свойство. Получение значения вложенного свойства возвращает значение по умолчанию из метаданных, когда свойство явно не задано для элемента.

Если у вас есть элемент на холсте без установки Canvas.Left, Canvas получит значение по умолчанию для Canvas.Left как 0 из метаданных. Сам элемент просто не имеет этого значения.

Так что в вашем случае вам придется применять IsAdorned в любом случае, и поэтому значение по умолчанию должно быть false.

Смежные вопросы