自定义依赖属性不起作用

时间:2011-05-07 03:38:46

标签: c# silverlight windows-phone-7

我有一个全景控件,其数据模板如下: -

   <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没有被触发?您可以在代码中看到的任何错误?

提前致谢:)

2 个答案:

答案 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/