标准属性有效,但依赖属性不在WPF中

时间:2013-07-29 13:12:36

标签: c# wpf xaml

我有以下代码,其中有效:

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

我有我想要的代码,但它不起作用。甚至不会调用setter:

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}"/>

为什么标准属性有效且依赖​​属性不起作用?

2 个答案:

答案 0 :(得分:7)

使用依赖项属性,.Net正在做一些并不明显的事情:它直接访问由ItemTemplateProperty标识的依赖项属性,而不是使用get和{{ 1}}您声明的方法。在这种情况下,唯一的区别是您的set永远不会运行。

当您使用依赖项属性时,您的getter和setter should only contain the usual things。其他任何东西都会让人感到困惑,因为WPF在使用该属性时会绕过它们。

如果您需要将_list.ItemTemplate = value;设置为该值,则应使用PropertyChangedCallback附加静态other DependencyProperty.Register overload。 E.g。

_list.ItemTemplate

答案 1 :(得分: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..
}