为了账号安全,请及时绑定邮箱和手机立即绑定

DependencyProperty getter / setter没有被调用

DependencyProperty getter / setter没有被调用

我试图创建派生自标准网格的自定义控件。我添加了一个ObservableCollection作为Custom控件的DependencyProperty。但是,永远不会达到它的获取/设置。在创建可以与ObservableCollection一起正常工作的DependencyProperty时,我可以有一些指导吗?public class MyGrid : Grid{    public ObservableCollection<string> Items    {        get        {            return (ObservableCollection<string>)GetValue(ItemsProperty);        }        set        {            SetValue(ItemsProperty, value);        }    }public static  DependencyProperty ItemsProperty =                DependencyProperty.Register("Items", typeof(ObservableCollection<string>),         typeof(MyGrid), new UIPropertyMetadata(null, OnItemsChanged));}
查看完整描述

2 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

我建议不要将ObservableCollection用作Items依赖项属性的类型。


在这里拥有ObservableCollection的原因(我想)是为了在CollectionChanged分配属性值时使UserControl能够附加处理程序。但是ObservableCollection太具体了。


WPF中的方法(例如在ItemsControl.ItemsSource中)是定义一个非常基本的接口类型(如IEnumerable),并在为属性分配值时,找出值集合是否实现了某些更特定的接口。这里至少是INotifyCollectionChanged,但是该集合也可以实现ICollectionView和INotifyPropertyChanged。所有这些接口不是强制性的,这将使您的依赖项属性可以绑定到各种类型的集合,从普通数组开始直到复杂的ItemCollection。


OnItemsChanged然后,您的属性更改回调将如下所示:


private static void OnItemsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)

{

    MyGrid grid = obj as MyGrid;


    if (grid != null)

    {

        var oldCollectionChanged = e.OldValue as INotifyCollectionChanged;

        var newCollectionChanged = e.NewValue as INotifyCollectionChanged;


        if (oldCollectionChanged != null)

        {

            oldCollectionChanged.CollectionChanged -= grid.OnItemsCollectionChanged;

        }


        if (newCollectionChanged != null)

        {

            newCollectionChanged.CollectionChanged += grid.OnItemsCollectionChanged;


            // in addition to adding a CollectionChanged handler

            // any already existing collection elements should be processed here

        }

    }

}


private void OnItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)

{

    // handle collection changes here

}


查看完整回答
反对 回复 2019-11-04
  • 2 回答
  • 0 关注
  • 652 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信