为什么INotifyPropertyChanged不起作用?

时间:2011-02-14 07:54:17

标签: c# .net wpf binding inotifypropertychanged

我使用Multibinding绑定一些属性并使用INotifyPropertyChanged接口来通知这些属性的更改。但遗憾的是,似乎INotifyPropertyChanged无法正常工作。 PropertyChangedEventHandler“PropertyChanged”始终为null。

问题:

一个。你能告诉我为什么事件是空的吗?在我看来,应该有一个事件PropertyChangedEventHandler的默认方法,我错了吗?(已解决,谢谢!)

B中。就像有些朋友说的那样,我再次尝试不使用INotifyPropertyChanged。但是目标的属性值似乎没有改变......


  1. 属性

    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. 多重绑定(看起来效果很好。使用转换器计算受“TopOffset”和“LeftOffset”影响的位置)

    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);
    
  3. INotifyPropertyChanged的

    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));
    }
    
  4. 通知更改

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

3 个答案:

答案 0 :(得分:4)

您不需要为依赖项属性实现INotifyPropertyChanged。绑定将自动跟踪这些属性的变化。

答案 1 :(得分:1)

在绑定的任何位置设置Mode=TwoWay

答案 2 :(得分:0)

您需要覆盖OnPropertyChanged并检查该属性是否是您要查找的属性。

protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
    if (e.Property == MyProperty)
    {
        // do something
    } 
    base.OnPropertyChanged(e);   
}
相关问题