2011-02-14 11 views
1

Multibinding을 사용하여 일부 속성을 바인딩하고 INotifyPropertyChanged 인터페이스를 사용하여 이러한 속성의 변경 사항을 알립니다.하지만 슬프게도 INotifyPropertyChanged가 작동하지 않는 것 같습니다. PropertyChangedEventHandler "PropertyChanged"는 항상 null입니다.INotifyPropertyChanged가 작동하지 않는 이유는 무엇입니까?

질문 :

A.이 PropertyChangedEventHandler을 이벤트가 null 인 이유를 말해 줄래 내 마음에서 이벤트에 대한 기본 방법이 있어야는, 내가 잘못

? (해결, 감사합니다!)

B. 몇몇 친구들은 내가 ...을 INotifyPropertyChanged.But 대상의 속성의 값이 변경되지 않은 것으로 보인다 사용하지 않고 다시 시도 말한대로


  1. PROPERT 이거

    public static readonly DependencyProperty LeftOffsetProperty = DependencyProperty.Register("LeftOffset", typeof(double), typeof(NetworkTaskLable), new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsRender)); 
    public static readonly DependencyProperty TopOffsetProperty = DependencyProperty.Register("TopOffset", typeof(double), typeof(NetworkTaskLable), new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsRender)); 
    
    public double LeftOffset 
    { 
        get { return (double)GetValue(LeftOffsetProperty); } 
        set { SetValue(LeftOffsetProperty, value); } 
    } 
    public double TopOffset 
    { 
        get { return (double)GetValue(TopOffsetProperty); } 
        set { SetValue(TopOffsetProperty, value); } 
    } 
    
  2. Multibinding는

    public event PropertyChangedEventHandler PropertyChanged; 
    public void CallPropertyChanged(string PropertyName) 
    { 
        if (PropertyChanged != null)//It seems to be null all the time!!!And the properties'changes were never notified!!! 
         PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
    } 
    
  3. 을에서 INotifyPropertyChanged

    var multibinding = new MultiBinding() { Converter = new BeginAndStartDateToLeftConverter_NetworkTaskLable(), ConverterParameter = NetworkView }; 
    multibinding.Bindings.Add(new Binding("Start")); 
    multibinding.Bindings.Add(new Binding("StartDate") { Source = NetworkView }); 
    multibinding.Bindings.Add(new Binding("LeftOffset") { Source = this }); 
    MainCanvas.SetBinding(LeftProperty, multibinding); 
    
  4. ("TopOffset"와 "LeftOffset"에 의해 영향을받는 위치를 계산하기 위해 변환기를 사용하여 well.By 작업 보인다)

  5. 변경 알림

    SetValue(LeftOffsetProperty, moveAdorner.LeftOffset); 
    CallPropertyChanged("LeftOffset"); 
    SetValue(TopOffsetProperty, moveAdorner.TopOffset); 
    CallPropertyChanged("TopOffset"); 
    
+2

종속성 속성이 있지만이 인터페이스는 setter에서 함수 호출을 사용하는 공통 속성에 적용됩니다. – vorrtex

+0

감사합니다, vorrtex.But 이유는 당신이 말한 것과 같지 않을 수 있습니다. 공용 속성을 알리려고했는데 이벤트가 여전히 null ... – Claw

+0

Vorrtex는 Binding 엔진이 내부적으로 구현 된 종속성 속성 변경 사항을 수신한다는 것을 의미합니다. WPF에서. 따라서 PropertyChanged에 대한 핸들러가 없습니다. –

답변

3

종속성 속성의 경우 INotifyPropertyChanged를 구현할 필요가 없습니다. 바인딩은 이러한 속성의 변경 사항을 자동으로 추적합니다.

0

OnPropertyChanged를 재정의하고 속성이 찾고자하는 속성인지 확인해야합니다.

protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
{ 
    if (e.Property == MyProperty) 
    { 
     // do something 
    } 
    base.OnPropertyChanged(e); 
} 
+0

감사합니다, Tom! OnProertyChanged()가 ProertyChanged 이벤트의 Defalt 메소드 일 수 있음을 상기시켜줍니다. ProertyChanged 이벤트는 여전히 비어 있었지만 (: P) OnProertyChanged() 이벤트가이 시간에 호출되었습니다. 몇 가지 추가 질문을, 제발 많이 물어 주시기 바랍니다. 이벤트가 여전히 null이지만 OnPropertyChanged() 메서드가 호출 되었습니까? – Claw

+0

종속성 속성은 INotifyPropertyChanged 구현을 지원하지 않으므로 PropertyChanged 이벤트가 작동하지 않습니다. 종속성 속성을 가지려면 종속성 속성을 지원하는 OnPropertyChanged 메서드를 제공하는 DependencyObject에서 상속해야합니다. –

0

바인딩에 어디서나 Mode=TwoWay을 설정 하시겠습니까?

+0

아니요 아니요.종속성 속성에 대한 CLR 속성 래퍼에 추가 로직을 추가해서는 안됩니다. 종속성 속성은 호출 할 수 없기 때문에 추가 속성을 절대로 추가해서는 안됩니다. 둘째, Dependency Property에 대해 PropertyChanged를 올릴 필요가 없습니다. –

+1

감사합니다, Meleak. 그걸 알아 냈어. –

+0

감사합니다, Meleak. 당신이 말했듯이, DependencyProperty는 PrpertyChanged를 올릴 필요가 없습니다. 그러나 변경 사항을 통지하는 방법은 자동으로 변경 될 수 있습니까? – Claw

관련 문제