我有以下代码,其中有效:
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}"/>
为什么标准属性有效且依赖属性不起作用?
答案 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..
}