DP回调未触发,然后在构造函数

时间:2015-09-15 06:22:54

标签: c# dependency-properties

我有ObservableCollection使用RichTextBox行为:

 public ObservableCollection<SendContent> RtbContent
    {
        get { return (ObservableCollection<SendContent>)GetValue(RtbContentProperty); }
        set { SetValue(RtbContentProperty, value); }
    }

    // Using a DependencyProperty as the backing store for RtbContent.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty RtbContentProperty =
        DependencyProperty.Register("RtbContent",
            typeof(ObservableCollection<SendContent>),
            typeof(RTBBehavior),
            new UIPropertyMetadata(new ObservableCollection<SendContent>(), new PropertyChangedCallback(RtbContentPropertyChanged)));


    public RTBBehavior()
    {
        SetValue(RtbContentProperty, new ObservableCollection<SendContent>());
    }

    private static void RtbContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs er)
    {
       NotifyCollectionChangedEventHandler handler= (s, e) => coll_CollectionChanged(s, e, d);


        if (er.NewValue !=null)
        {
            var coll = (ObservableCollection<SendContent>)er.NewValue;
            coll.CollectionChanged += handler;
        }
        if (er.OldValue !=null)
        {
            var coll = (ObservableCollection<SendContent>)er.OldValue;
            coll.CollectionChanged -= handler;
        }
    }

    private static void coll_CollectionChanged(object se, NotifyCollectionChangedEventArgs en, DependencyObject dob)
    {
        PropertyChangedEventHandler handler = (s, e) => Item_PropertyChanged(se, e, dob);

        if (en.NewItems != null)
        {
            var coll = (ObservableCollection<SendContent>)se;

            foreach (var item in coll)
            {
                item.PropertyChanged += handler;
            }
        }
        if (en.OldItems != null)
        {
            var coll = (ObservableCollection<SendContent>)se;

            foreach (var item in coll)
            {
                item.PropertyChanged -= handler;
            }
        }
    }

    private static void Item_PropertyChanged(object s, PropertyChangedEventArgs e, DependencyObject dob)
    {
        List<string> list = new List<string>();
        var rtb = (RichTextBox)dob;
        var collect = (ObservableCollection<SendContent>)s;
        var dobj = (RichTextBox)dob;            

        foreach (var item in collect)
        {
            if (item.Value2)
            {
                list.Add(item.Value1);
            }
        }

        if (list.Contains("Some2"))
        {
            dobj.Background = Brushes.Red;
        }
        else
        {
            dobj.Background = Brushes.Green;

        }
    }

如果我在构造函数Collect = new ObservableCollection<SendContent>();中创建新集合并在按钮单击时添加项目(例如

),它可以正常工作
Collect.Add(new SendContent { Value1 = "Some0", Value2 = true });

但是我尝试在构造函数中添加项目,RtbContentPropertyChanged触发一次并获得已填充的集合er.NewValue,并且它不会转向订阅每个添加项目的更改。我怎么能避免它?

0 个答案:

没有答案