3

라고 안한다 RatesProperty. 요금 및 관련 메소드는 다음과 같다 : I가 ObservableCollection에 요금을 변경할 때 예상처럼종속성 속성 'PropertyChangedCallback은

private ObservableCollection<double> rates; 
public ObservableCollection<double> Rates 
{ 
    get { return this.rates; } 
    set 
    { 
     if (this.rates != value) 
     { 
      this.rates = value; 
      OnPropertyChanged("Rates"); 
     } 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 
protected virtual void OnPropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

가 (예컨대 this.Rates = new ObservableCollection<double>() { 1.0, 2.0 }으로) 사용자 제어 OnRatesChanged() 메소드를 호출한다. 나는 다음을 실행할 때, 호출되지 않습니다

this.Rates[0] = (double)1; 
this.Rates[1] = (double)2; 
OnPropertyChanged("Rates"); 

은 내가 올바른 속성 이름과 함께하여 PropertyChanged 이벤트를 발생시킬 때, 사용자 정의 컨트롤에서 해당 콜백이 항상 호출 것으로 예상. 틀렸어? 이 스레드를 찾았 : Getting PropertyChangedCallback of a dependency property always - Silverlight 은색을 다루고 있지만 WPF에서는 마찬가지라고 생각합니다.

프레임 워크는 백그라운드의 바운드 프로퍼티 (내 예제에서는 "Rates")가 변경되었는지 여부와 변경된 경우에만 관련 콜백을 호출하는지 확인합니다. 따라서 내 컬렉션의 요소를 변경해도 아무런 영향이 없으며 항상 전체 컬렉션을 변경해야합니다.

감사합니다.

+1

, 왜이 변경 될 때 컬렉션이 통지 것을 이용하지 개별 항목? – Per

답변

6

귀하의 결론은 맞습니다. Rates 종속성 속성이 새 컬렉션 (또는 null)으로 설정된 경우 OnRatesChanged 콜백이 호출 될 것입니다. 위해

컬렉션의 변경에 대한 통지를 얻을, 당신은 또한 등록 할 것 NotifyCollectionChangedEventHandler :

당신은 관측 컬렉션에 바인딩
private static void OnRatesChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var pieChart = (PieChart)d; 
    var oldRates = e.OldValue as INotifyCollectionChanged; 
    var newRates = e.NewValue as INotifyCollectionChanged; 

    if (oldRates != null) 
    { 
     oldRates.CollectionChanged -= pieChart.OnRatesCollectionChanged; 
    } 

    if (newRates != null) 
    { 
     newRates.CollectionChanged += pieChart.OnRatesCollectionChanged; 
    } 

    pieChart.drawChart(); 
} 

private void OnRatesCollectionChanged(
    object sender, NotifyCollectionChangedEventArgs e) 
{ 
    switch (e.Action) 
    { 
     ... 
    } 

    drawChart(); 
} 
+0

네, 고맙습니다. 변경 사항에 반응하도록 UserControl을 변경하는 것은 외부에서 업데이트를 수동으로 "강제 적용"하는 것보다 더 좋은 방법입니다. 한 가지 추가 사항 : 콜렉션이 변경된 경우에만 콜렉션의 항목이 제거/추가 된 경우에만 발생하므로 컬렉션의 항목 변경에 대한 알림을 받으려면 새 클래스 내에 double 유형의 항목을 래핑해야합니다. 등록자가 변경됩니다. – schoola