繁体   English   中英

自定义依赖属性不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM