2013-07-29 78 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確定使用你聲明的getset方法,而不是直接的依賴項屬性。在這種情況下,唯一的區別是您的_list.ItemTemplate = value;永遠不會運行。

當您使用依賴屬性,你的getter和setter should only contain the usual things。其他任何事情最終都會讓人困惑,因爲WPF在使用屬性時會繞過它們。

如果您需要將_list.ItemTemplate設置爲該值,則應使用other DependencyProperty.Register overload附加靜態PropertyChangedCallback。例如。

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從未調用「設置」的方法,而不是你將不得不尋找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.. 
}