【问题标题】:How to update other dependent property on change of one property如何在更改一个属性时更新其他依赖属性
【发布时间】:2017-08-05 10:57:54
【问题描述】:

假设在 C# WPF 类中我有这样的东西:

class test: INotifyPropertyChanged
{
    private datetime _DOB
    public datetime DOB 
    {
        get
        {
            return _DOB;
        }
        set
        {
            if (_DOB != value)
            {
                _DOB = value;
                RaisePropertyChanged();
            }
        }
    }

    private int _age
    public int Age 
    {
        get
        {
            return _age;
        }
        set
        {
            if (_age != value)
            {
                _age = value;
                RaisePropertyChanged();
            }
        }
    }
....

}

现在,让我们假设用户可以输入任何属性。他们可以输入他们的出生日期或年龄,因此让其中一个计算属性是行不通的。

除了在 DOB 的 setter 中使用 UpdateAge() 和在 Age 的 setter 中使用 UpdateDOB() 之类的方法之外,是否有任何其他方法可以自动更新“依赖”属性以及依赖属性(INPC 负责的)?

【问题讨论】:

  • 这在计算属性的情况下肯定会有所帮助,但对我来说不是。

标签: c# wpf properties inotifypropertychanged


【解决方案1】:

是否有任何其他方法可以自动更新“依赖”属性以及依赖属性(由 INPC 负责)?

这里没有“自动”或魔法。您需要为要在视图中刷新的数据绑定属性设置支持字段并引发 PropertyChanged 事件。

只要确保您不会陷入无限循环,您可以从DOB 属性设置Age 属性,反之亦然。

您可以在 DOB 属性的设置器中设置 _age 支持字段,反之亦然,例如:

private DateTime _DOB;
public DateTime DOB
{
    get
    {
        return _DOB;
    }
    set
    {
        if (_DOB != value)
        {
            _DOB = value;
            RaisePropertyChanged();

            _age = DateTime.Now.Year - _DOB.Year;
            RaisePropertyChanged("Age");
        }
    }
}

【讨论】:

  • “请确保您不会陷入无限循环,您可以从 DOB 属性中设置 Age 属性,反之亦然。”我希望if (_DOB != value) 条件能解决这个问题。我错了吗?
  • 假设您对日期的计算是正确的,您可能是对的 :) 无论如何,记住这一点是一件好事,您显然已经这样做了。
  • 谢谢。我希望有一些方法可以表达一个属性对其他属性的依赖,这样改变一个属性的值会自动触发对其他属性的重新评估。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2020-02-21
相关资源
最近更新 更多