[英]Custom dependency property not working
我有一个全景控件,其数据模板如下: -
<DataTemplate x:Key="DataTemplateCategory">
<Grid >
<localControls:PanoramaItem BookmarkedTopics="{Binding Path=BookmarkedTopics,ElementName=root}" Topics="{Binding Topics}"/>
</Grid>
</DataTemplate>
根是定义全景图的usercontrol的名称。 Path中的BookmarkedTopics是root(usercontrol)中的DependencyProperty,其定义如下: -
public static readonly DependencyProperty BookmarkedTopicsProperty = DependencyProperty.Register("BookmarkedTopics",
typeof(ObservableCollection<Topic>), typeof(MainPage), new PropertyMetadata(new ObservableCollection<Topic>()));
public ObservableCollection<Topic> BookmarkedTopics
{
get { return GetValue(BookmarkedTopicsProperty) as ObservableCollection<Topic>; }
set
{
SetValue(BookmarkedTopicsProperty, value);
}
}
BookmarkedTopics在MainPage_Loaded中设置,它永远不会为null或空集合(与我的问题无关但仍然想提到它)。 BookmarkedTopics是PanoramaItem中的Dependency属性,其定义如下: -
public static readonly DependencyProperty BookmarkedTopicsProperty = DependencyProperty.Register("BookmarkedTopics",
typeof(ObservableCollection<Topic>), typeof(PanoramaItem), new PropertyMetadata(new ObservableCollection<Topic>()));
public ObservableCollection<Topic> BookmarkedTopics
{
get { return GetValue(BookmarkedTopicsProperty) as ObservableCollection<Topic>; }
set
{
SetValue(BookmarkedTopicsProperty, value);
}
}
问题是当BookmarkedTopics在MainPage_Loaded中设置时,为什么PanoramaItem中的BookmarkedTopics的setter没有被触发? 您可以在代码中看到的任何错误?
提前致谢 :)
通过绑定或动画分配依赖项属性值时,Silverlight使用相应的DependencyProperty
静态字段直接使用SetValue
方法。 因此,不调用POCO属性的setter方法。
如果需要在分配依赖项属性时运行代码,则需要使用如下代码: -
public ObservableCollection<Topic> BookmarkedTopics
{
get { return GetValue(BookmarkedTopicsProperty) as ObservableCollection<Topic>; }
set { SetValue(BookmarkedTopicsProperty, value); }
}
public static readonly DependencyProperty BookmarkedTopicsProperty =
DependencyProperty.Register(
"BookmarkedTopics",
typeof(ObservableCollection<Topic>),
typeof(MainPage),
new PropertyMetadata(null, OnBookmarkedTopicsPropertyChanged));
private static void OnBookmarkedTopicsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MainPage source = d as MainPage;
ObservableCollection<Topic> value = e.NewValue as ObservableCollection<Topic>;
// Code here to handle any work when the value has changed
}
另请注意,此依赖项属性的默认值为null
。 不要将可变类型的实例用于依赖项属性默认值,因为该类的所有实例都会共享一个实例。
我知道在依赖属性中使用ObservableCollection类型存在问题,我知道你不应该给它一个新的ObservableCollection的默认值。 相反,你应该将它注册为ReadOnly(注意这并不仅仅意味着将它的定义只读)。
这篇MSDN帖子更详细地描述了它。 http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/e19f9f98-9007-4dbd-b1c4-664a511c0846/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.