2012-02-09 3 views
5

я определил свойство в моем UserControl так:DependencyProperty не срабатывает

public bool IsSelected 
    { 
     get { return (bool)GetValue(IsSelectedProperty); } 
     set 
     { 
      SetValue(IsSelectedProperty, value); 
      StackPanelDetails.Visibility = value ? Visibility.Visible : Visibility.Collapsed; 
     } 
    } 

    public static readonly DependencyProperty IsSelectedProperty = 
     DependencyProperty.Register("IsSelected", typeof (bool), typeof (ucMyControl)); 

Но когда я установил его свойство в XAML, он хочет вызвать его (набор не называется).

<DataTemplate><local:ucTopicItem IsSelected="False" /></DataTemplate> 

В чем проблема?

+1

В классе ucMyControl содержится коллекция объектов ucTopicItem? Или это одно и то же? Вы регистрируете DP на ucMyControl, но устанавливаете его на ucTopicItem. Вы также можете попробовать RegisterAttached вместо Register. – avanek

ответ

8

сеттер вашего DependencyProperty не будет вызываться WPF, когда DP установлен в XAML. WPF будет устанавливать DependencyProperty напрямую.

См. MSDN XAML Loading and Dependency Properties для объяснения причин, почему сеттер не вызывается.

+0

Какая жалость. Но я думаю, это отвечает на вопрос. – Nickolodeon

5

Вы должны использовать свойство измененного обработчика в свойстве зависимости напрямую. Таким образом, вы убедитесь, что она вызывается при установке в XAML:

public static readonly DependencyProperty IsSelectedProperty = 
    DependencyProperty.Register("IsSelected", typeof(bool), typeof(ucMyControl), new PropertyMetadata(false, OnIsSelectedChanged)); 

private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    // Implement change logic 
} 
+0

Черт, gazumped :) –

+0

Я сделал это, но OnIsSelectedChanged все равно не вызывается. – Nickolodeon

+0

@Nickolodeon, вы должны зарегистрировать PropertyChangedCallback через аргумент 'PropertyMetadata' в [Register] (http://msdn.microsoft.com/en-us/library/ms597502.aspx). – Clemens

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