属性在DependencyProperty中更改

在上一篇文章中,我询问了如何将属性注册为DependencyProperty。 我得到了答案,它运作正常。

但是现在我想在Click上为这个DependencyProperty添加一些Items。 这不起作用。 我注册DependencyProperty的代码是:

public static readonly DependencyProperty ChartEntriesProperty = DependencyProperty.Register( "ChartEntries", typeof(ObservableCollection), typeof(ChartView), new FrameworkPropertyMetadata(OnChartEntriesChanged)); private static void OnChartEntriesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { } 

在从我的XAML绑定到我的c#-code时,调用OnChartEntriesChanged-Event。 但是如果我之后添加ChartEntry(按下按钮),则不会触发事件。

有谁知道为什么?

将项添加到ChartEntries集合时,实际上并未更改该属性,因此不会调用PropertyChangedCallback。 为了获得有关集合中更改的通知,您需要注册其他CollectionChanged事件处理程序:

 private static void OnChartEntriesChanged( DependencyObject obj, DependencyPropertyChangedEventArgs e) { var chartView = (ChartView)obj; var oldCollection = e.OldValue as INotifyCollectionChanged; var newCollection = e.NewValue as INotifyCollectionChanged; if (oldCollection != null) { oldCollection.CollectionChanged -= chartView.OnChartEntriesCollectionChanged; } if (newCollection != null) { newCollection.CollectionChanged += chartView.OnChartEntriesCollectionChanged; } } private void OnChartEntriesCollectionChanged( object sender, NotifyCollectionChangedEventArgs e) { ... } 

不使用ObservableCollection作为属性类型,而只是使用ICollectionIEnumerable也是有意义的。 这将允许在具体集合类型中实现INotifyCollectionChanged其他实现。 有关更多信息,请参见此处和此处 。

当您设置ObservableCollection的新实例时,将调用OnChartEntriesChanged回调。 您将不得不收听如下更改的集合:

  private static void OnChartEntriesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((ObservableCollection)e.OldValue).CollectionChanged -= new System.Collections.Specialized.NotifyCollectionChangedEventHandler(ChartView_CollectionChanged); ((ObservableCollection)e.NewValue).CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(ChartView_CollectionChanged); } static void ChartView_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { } 

对不起,但这不会起作用,因为你已经发现了自己。 如果属性的值发生更改,则DependencyProperty更改的处理程序仅触发,但在您的情况下则不会,因为对象引用仍然相同。 您必须在提供的集合的CollectionChanged事件处理程序上注册。 (这可以在dependencyproperty的propertychanged处理程序中完成)