【问题标题】:Why doesn't the INotifyPropertyChanged work?为什么 INotifyPropertyChanged 不起作用?
【发布时间】:2011-06-26 18:28:13
【问题描述】:

我使用了Multibinding绑定了一些属性,并使用了INotifyPropertyChanged接口来通知这些属性的更改。但是很遗憾,INotifyPropertyChanged似乎不起作用。 PropertyChangedEventHandler“PropertyChanged”一直为空。

问题:

A.你能告诉我为什么事件为空吗?在我看来,事件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");
    

【问题讨论】:

  • 你有依赖属性,但是这个接口是通过setter中的函数调用应用到公共属性的。
  • 谢谢你,vorrtex。但原因可能不像你说的那样。我试图通知一个公共财产,事件仍然为空......
  • Vorrtex 意味着在您的情况下,绑定引擎侦听在 WPF 内部实现的依赖项属性更改。所以没有针对 PropertyChanged 的​​处理程序。
  • 我会尽量解释清楚。从代码更新 UI 有两种互斥方式:1)使用 DependencyProperties; 2) 使用具有已实现 INotifyPropertyChanged 的​​公共属性。您选择了第一种方式,因此您可以从您的类中删除 PropertyChanged 事件和相关函数。

标签: c# .net wpf binding inotifypropertychanged


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 没有没有。您永远不应向依赖属性的 CLR 属性包装器添加任何其他逻辑,因为不能保证调用它。其次,没有必要为依赖属性引发 PropertyChanged
    • 谢谢,Meleak。清除了。
    • 谢谢,Meleak。就像你说的,DependencyProperty 不需要引发 PrpertyChanged。但是如何通知更改?它可能会自动更改?
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢,汤姆!它提醒我 OnProertyChanged() 可能是事件 ProertyChanged 的​​默认方法。我试过你的方法,事件 ProertyChanged 仍然为空(:P),但 OnProertyChanged()是这次打来电话。请问您能再问一些问题吗,非常感谢。 1.为什么事件还是null,但是调用了OnPropertyChanged()方法?
    • 依赖属性不支持 INotifyPropertyChanged 实现,这就是 PropertyChanged 事件不起作用的原因。要拥有一个依赖属性,您需要从 DependencyObject 继承,它公开了支持依赖属性的 OnPropertyChanged 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多