我有一个全景控件,其数据模板如下: -
<DataTemplate x:Key="DataTemplateCategory">
<Grid >
<localControls:PanoramaItem BookmarkedTopics="{Binding Path=BookmarkedTopics,ElementName=root}" Topics="{Binding Topics}"/>
</Grid>
</DataTemplate>
root是定义全景图的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没有被触发?您可以在代码中看到的任何错误?
提前致谢:)
答案 0 :(得分:9)
当绑定或动画分配依赖项属性值时,Silverlight使用SetValue
方法直接使用相应的DependencyProperty
静态字段。因此,不会调用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
。不要将可变类型的实例用于依赖项属性默认值,因为该类的所有实例都会共享一个实例。
答案 1 :(得分:-1)
我知道在依赖属性中使用ObservableCollection类型存在问题,我知道你不应该给它一个新的ObservableCollection的默认值。相反,你应该将它注册为ReadOnly(注意这并不仅仅意味着将它的定义只读)。
此MSDN帖子更详细地描述了它。 http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/e19f9f98-9007-4dbd-b1c4-664a511c0846/