C# 自定义依赖项属性不工作
我有一个全景控件,其数据模板如下:-C# 自定义依赖项属性不工作,c#,silverlight,windows-phone-7,C#,Silverlight,Windows Phone 7,我有一个全景控件,其数据模板如下:- <DataTemplate x:Key="DataTemplateCategory"> <Grid > <localControls:PanoramaItem BookmarkedTopics="{Binding Path=BookmarkedTopics,ElementName=root}" Topics="{Binding Topics}"/>
<DataTemplate x:Key="DataTemplateCategory">
<Grid >
<localControls:PanoramaItem BookmarkedTopics="{Binding Path=BookmarkedTopics,ElementName=root}" Topics="{Binding Topics}"/>
</Grid>
</DataTemplate>
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);
}
}
根是定义全景的usercontrol的名称。路径中的BookmarkedTopics是根(usercontrol)中的DependencyProperty,其定义如下:-
<DataTemplate x:Key="DataTemplateCategory">
<Grid >
<localControls:PanoramaItem BookmarkedTopics="{Binding Path=BookmarkedTopics,ElementName=root}" Topics="{Binding Topics}"/>
</Grid>
</DataTemplate>
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);
}
}
公共静态只读DependencyProperty BookmarkedTopicProperty=DependencyProperty.Register(“BookmarkedTopics”,
typeof(ObservableCollection)、typeof(MainPage)、new PropertyMetadata(new ObservableCollection());
公共可观察收集书签主题
{
获取{返回GetValue(BookmarkedTopicProperty)作为ObservableCollection;}
设置
{
设置值(BookmarkedTopicProperty,值);
}
}
BookmarkedTopics在MainPage_中被设置,并且它从不为null或空集合(与我的问题无关,但仍然想提及它)。BookmarkedTopics是PanoramItem中的依赖项属性,其定义为:-
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);
}
}
公共静态只读DependencyProperty BookmarkedTopicProperty=DependencyProperty.Register(“BookmarkedTopics”,
typeof(ObservableCollection)、typeof(PanoramaItem)、new PropertyMetadata(new ObservableCollection());
公共可观察收集书签主题
{
获取{返回GetValue(BookmarkedTopicProperty)作为ObservableCollection;}
设置
{
设置值(BookmarkedTopicProperty,值);
}
}
问题是,当在主页中设置书签主题时,为什么全景项目中的书签主题的设置程序没有启动?你能在代码中看到任何bug吗
提前感谢:)我知道在依赖性属性中使用ObservableCollection类型存在问题,我确信您不应该给它一个新ObservableCollection的默认值。相反,您应该将其注册为只读(请注意,这不仅仅意味着将其定义为只读) 这篇MSDN文章更详细地描述了它。
当绑定或动画指定依赖项属性值时,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
}
public observateCollection BookmarkedTopics
{
获取{返回GetValue(BookmarkedTopicProperty)作为ObservableCollection;}
set{SetValue(bookmarketTopicProperty,value);}
}
公共静态只读从属属性BookmarkedTopicProperty=
从属属性。寄存器(
“书签主题”,
类型(可观测采集),
类型(主页),
新的PropertyMetadata(null,OnBookmarkedTopicPropertyChanged));
BookmarkedTopicPropertyChanged上的私有静态无效(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
MainPage source=d作为MainPage;
ObservableCollection值=e.作为ObservableCollection的新值;
//此处的代码用于在值更改时处理任何工作
}
请注意,此依赖项属性的默认值为
null
。不要将可变类型的实例用作依赖项属性默认值,因为该实例随后会被类的所有实例共享。我不明白您在说什么。WP7 Silverlight中没有RegisterReadOnly这样的静态方法。使用此方法也能解决我的问题吗?他说的是,如果在依赖项属性中使用集合类型,那么每次设置值时,都会将原始集合销毁为已删除并替换为新集合,而不是编辑原始集合。若要修复此问题,请创建一个包含集合的只读属性,以便无法仅删除原始集合编辑代码是否仍然有效?虽然问题似乎集中在属性实现上(这是错误的,需要纠正),但我怀疑真正的问题在于绑定。数据模板在MainPage.xaml中吗?@AnthonyWJones:-是的,它在MainPage.xaml中。-解释得很好。我很快就想到了。你应该成为一名家庭教师。你的所有答案都切中要害,完美地解决了问题。