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中。-解释得很好。我很快就想到了。你应该成为一名家庭教师。你的所有答案都切中要害,完美地解决了问题。