2013-10-24 214 views
2

previous post我問如何註冊屬性作爲DependencyProperty。我有一個答案,它工作正常。屬性更改依賴屬性

但是現在我想在Click上添加一些項目到這個DependencyProperty。這不起作用。我的代碼註冊的DependencyProperty是:

public static readonly DependencyProperty ChartEntriesProperty = DependencyProperty.Register(
     "ChartEntries", typeof(ObservableCollection<ChartEntry>), typeof(ChartView), 
     new FrameworkPropertyMetadata(OnChartEntriesChanged)); 

    private static void OnChartEntriesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 

    } 

的OnChartEntriesChanged-事件被稱爲在我從我的XAML綁定到我的C#-code的時刻。但是,如果我以後添加ChartEntry(按鈕單擊)事件不會被解僱。

有誰知道爲什麼?

回答

4

當您添加一個項目到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<ChartEntry>的屬性類型,而只是ICollectionIEnumerable代替。這將允許具體集合類型中的INotifyCollectionChanged的其他實現。有關更多信息,請參閱herehere

0

對不起,但這不會像你發現自己一樣。 DependencyProperty更改處理程序只會觸發,如果屬性的值發生更改,但在您的情況下它不會,因爲對象引用仍然是相同的。您必須在提供的集合的CollectionChanged事件處理程序上註冊。 (這個你可以從的DependencyProperty的PropertyChanged處理程序做)

1

OnChartEntriesChanged當您將設置ObservableCollection的新實例時,將會調用回調。您將不得不收聽收藏變更如下:

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

    static void ChartView_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 

    }