2013-07-29 14 views
7

Ich habe den folgenden Code hinter, die funktioniert:Standardeigenschaft funktioniert, aber Abhängigkeitseigenschaft nicht in WPF

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

Und ich habe den Code, das ich haben will, aber es funktioniert nicht . Setter ist noch nie aufgerufen:

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

Die Verwendung das heißt in XAML:

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

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

Warum die Standard-Eigenschaft funktioniert und Abhängigkeitseigenschaft nicht?

Antwort

7

Mit der Abhängigkeitseigenschaft, tut .Net etwas, das nicht offensichtlich ist: es die Abhängigkeitseigenschaft von ItemTemplateProperty direkt anstatt die get und set Methoden identifiziert zugreift, die Sie erklärt. Der einzige Unterschied ist in diesem Fall, dass Ihr _list.ItemTemplate = value; nie ausgeführt wird.

Wenn Sie Abhängigkeitseigenschaften verwenden, werden Ihre Getter und Setter should only contain the usual things. Alles andere wird verwirrend sein, weil WPF sie umgeht, wenn es die Eigenschaft verwendet.

Wenn Sie den Wert _list.ItemTemplate auf den Wert setzen müssen, sollten Sie eine statische PropertyChangedCallback unter Verwendung der other DependencyProperty.Register overload anhängen. Z.B.

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

Bitte beachten Sie auch die Erklärung [hier] (http://msdn.microsoft.com/en-us/library/bb613563.aspx). – Clemens

+0

@Clemens Danke, ich habe diesen Link hinzugefügt (ich habe schon dasselbe gesagt, aber eine autoritativere, professionell geschriebene Quelle ist nie eine schlechte Sache). =) –

2

DependencyProperty ruft nie „Set“ Methode, stattdessen werden Sie für Property Event-Handler innerhalb Erstellung von Abhängigkeitseigenschaft Erklärung suchen.

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.. 
} 
Verwandte Themen