【问题标题】:MVVM How to get notified when nested objects properties are updated?MVVM 如何在嵌套对象属性更新时得到通知?
【发布时间】:2019-03-21 21:23:47
【问题描述】:

例如

class child : ObservableObject{
  private int _prop;
  public int prop{
    get {
      return _prop;
    }
    set {
      _prop=value;
      OnPropertyChanged("prop");
    }
}
class parent : ObservableObject{
  private child _mychild;
  public child mychild{
    get {
      return _mychild;
    }
    set {
      _mychild=value;
      OnPropertyChanged("mychild");
      OnPropertyChanged("pow");
    }
  }
  public int pow{
    return _mychild.prop*2;
  }
}

parent myobj;
myobj.child.prop=1;

如何收到有关 bar.z 更新的通知?我已经绑定了嵌套属性并更新了视图,但是绑定 bar.pow 的部分没有得到更新。

<Textbox Text={Binding myobj.child.prop}/>
<Textbox Text={Binding myobj.pow}/>

我想要做的是在更新第一个文本框时更新第二个文本框。

【问题讨论】:

  • 你在哪里绑定了嵌套属性?请阅读MCVE
  • 对不起。我已经更新了问题
  • 建议您使用nameof 来获取实际的属性名称。

标签: c# .net wpf mvvm inotifypropertychanged


【解决方案1】:

您必须在父对象中订阅子对象的PropertyChanged,并在child.PropertyChanged 的事件处理程序中通知视图哪些属性会受到影响。不要忘记取消订阅前一个对象。

class foo: ObservableObject
{
private int _x;
public int x
{
    get
    {
        return _x;
    }
    set
    {
        _x = value;
        OnPropertyChanged("x");
    }
}
class bar : ObservableObject
{
    private foo _y;
    public foo y
    {
        get
        {
            return _y;
        }
        set
        {
            if (_y!=null)
            {
                _y.PropertyChanged -= _y_PropertyChanged;
            }

            _y = value;
            _y.PropertyChanged += _y_PropertyChanged;

            OnPropertyChanged("y");
            OnPropertyChanged("pow");
        }
    }

    private void _y_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        //if(e.PropertyName == "x");
        //{
        OnPropertyChanged("pow");
        OnPropertyChanged("y");
        //}
    }

    public int pow { get { return _y.x * 2;} }
}

【讨论】:

  • 你不需要 OnPropertyChanged("y"); in _y_PropertyChanged() - 这已经由 y 属性设置器处理了。
  • @Peregrine x 上的更改不在 y setter 中处理。在 y setter 中只处理 y 本身的变化。
  • @Peregrine 对于特定情况,我们不需要OnPropertyChanged("y"),但随着对象y的变化,通知这个变化是正确的。
  • @Rekshino 在这种情况下可能没有任何显着差异,但是每个(不必要的)NotifyPropertyChanged 事件都会降低应用程序的效率。通常,您只想在属性值实际发生更改时发送 NotifyPropertyChanged 事件,而不仅仅是因为其子属性之一发生了更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2021-07-01
  • 1970-01-01
相关资源
最近更新 更多