2013-07-29 9 views
7

Mam następujący kod tyłu, który działa:Nieruchomość Standard działa, ale właściwość zależność nie w WPF

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

I mam kod, który chcę mieć, ale to nie działa . Nawet seter nie jest wywoływany:

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); 
    } 
} 

Zastosowanie że jest w XAML:

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

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

Dlaczego standardowe prace nieruchomości oraz zależność nie?

Odpowiedz

7

Za pomocą właściwości dependence .Net robi coś, co nie jest oczywiste: uzyskuje dostęp do właściwości zależności identyfikowanej przez ItemTemplateProperty bezpośrednio, zamiast za pomocą zadeklarowanych metod get i set. Jedyna różnica w tym przypadku polega na tym, że twój _list.ItemTemplate = value; nigdy nie jest uruchamiany.

Podczas korzystania z właściwości zależności pobiera i ustawia should only contain the usual things. Coś innego może być mylące, ponieważ WPF pomija je, gdy korzysta z właściwości.

Jeśli musisz ustawić _list.ItemTemplate na wartość, powinieneś dołączyć statyczny PropertyChangedCallback używając other DependencyProperty.Register overload. Na przykład.

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

Należy również zwrócić uwagę na wyjaśnienie [tutaj] (http://msdn.microsoft.com/en-us/library/bb613563.aspx). – Clemens

+0

@Clemens Dzięki, dodałem ten link (już mówiłem to samo, ale bardziej autorytatywne źródło pisane profesjonalnie nigdy nie jest złe). =) –

2

DependencyProperty nie wywołuje „Set” metoda, zamiast tego będzie musiał poszukać obsługi zdarzeń PropertyChanged ciągu utworzenia rachunku właściwość zależność.

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.. 
} 
Powiązane problemy