2013-07-29 2 views
7

У меня есть следующий код позади, который работает:Стандартное свойство работает, но свойство зависимостей не в WPF

public DataTemplate ItemTemplate 
{ 
    get { return _list.ItemTemplate; } 
    set { _list.ItemTemplate = value; } 
} 

И у меня есть код, который я хочу иметь, но он не работает , Даже сеттер никогда не вызывается:

public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(MyUserControl)); 
public DataTemplate ItemTemplate 
{ 
    get { return (DataTemplate)GetValue(ItemTemplateProperty); } 
    set 
    { 
     _list.ItemTemplate = value; 
     SetValue(ItemTemplateProperty, value); 
    } 
} 

Использование что в XAML:

<Window.Resources> 
    <DataTemplate x:Key="ItemTemplate"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </DataTemplate> 
</Window.Resources> 

<local:MyUserControl ItemTemplate="{StaticResource ItemTemplate}"/> 

Почему стандартные работы собственности и свойства зависимостей нет?

ответ

7

С свойством зависимостей .Net делает что-то не очевидное: он обращается к свойству зависимости, идентифицированному с помощью ItemTemplateProperty, вместо использования методов и set, которые вы указали. Единственная разница в этом случае заключается в том, что ваш _list.ItemTemplate = value; никогда не запускается.

Когда вы используете свойства зависимостей, ваши геттеры и сеттеры should only contain the usual things. Все остальное будет запутывать, потому что WPF обходит их, когда он использует свойство.

Если вам необходимо установить значение _list.ItemTemplate, вы должны установить статическое PropertyChangedCallback, используя other DependencyProperty.Register overload. Например.

private static void OnItemTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
    var uc = (MyUserControl)d; 
    uc._list.ItemTemplate = (DataTemplate)e.NewValue; 
} 
+0

Также обратите внимание на пояснения [здесь] (http://msdn.microsoft.com/en-us/library/bb613563.aspx). – Clemens

+0

@ Clemens Спасибо, я добавил эту ссылку (я уже говорил то же самое, но более авторитетный профессионально-письменный источник никогда не бывает плохим). знак равно –

2

DependencyProperty никогда не вызывает «Set» метод, вместо этого вам придется искать обработчик события PropertyChanged в создании заявления свойства зависимостей.

public static readonly DependencyProperty ItemTemplateProperty = 
    DependencyProperty.Register(
     "ItemTemplate", 
     typeof(DataTemplate), 
     typeof(MyUserControl), 
     new FrameworkPropertyMetadata( 
      null, 
      new PropertyChangedCallback(ItemTemplateChanged))); 
public DataTemplate ItemTemplate 
{ 
    get { return (DataTemplate)GetValue(ItemTemplateProperty); } 
    set 
    { 
     _list.ItemTemplate = value; 
     SetValue(ItemTemplateProperty, value); 
    } 
} 

public static void ItemTemplateChanged(
    DependencyObject sender, 
    DependencyPropertyChangedEventArgs e){ 
    ((MyUserControl)sender).OnItemTemplateChanged(e); 
} 

protected void OnItemTemplateChanged(DependencyPropertyChangedEventArgs e){ 
    // you write your code here.. 
} 
Смежные вопросы