属性取决于另一个类的属性

时间:2014-01-06 00:04:29

标签: c# mvvm windows-phone-8 inotifypropertychanged fody-propertychanged

我有一个使用Fody的Windows Phone 8应用程序将INotifyPropertyChanged注入属性。 我有Class First的属性A,它绑定到View中的文本框:

[ImplementPropertyChanged]
public class First
{
    public int A { get; set; }

    public int AA { get {return A + 1; } }
}

第二类,属性B取决于属性A(也绑定到文本框):

[ImplementPropertyChanged]
public class Second
{
    private First first;

    public int B { get {return first.A + 1; } }
}

更新A和AA工作正常,但B在第一次更改时不会自动更新。有没有一种简单而干净的方法来使用fody实现这样的自动更新,还是我必须创建自己的事件来处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

我对Fody并不熟悉,但我怀疑是因为Second.B上没有二传手。第二个应该订阅First中的更改,如果First.A是要更改的属性,那么应该使用B的(私有)setter。

或者订阅First然后调用B属性更改事件:

[ImplementPropertyChanged]
public class Second
{
    private First first;

    public int B { get {return first.A + 1; } }

    public Second(First first)
    {
        this.first = first;
        this.first.OnPropertyChanged += (s,e) =>
        {
            if (e.PropertyName == "A") this.OnPropertyChanged("B");
        }
}

答案 1 :(得分:1)

我最终以SKall建议的方式使用标准的INotifyPropertyChanged。

public class First : INotifyPropertyChanged
{
    public int A { get; set; }

    public int AA { get {return A + 1; } }

    (...) // INotifyPropertyChanged implementation
}

public class Second : INotifyPropertyChanged
{
    private First first;

    public Second(First first)
    {
        this.first = first;
        this.first.PropertyChanged += (s,e) => { FirstPropertyChanged(e.PropertyName);

        public int B { get {return first.A + 1; } }

        protected virtual void FirstPropertyChanged(string propertyName)
        {
            if (propertyName == "A")
                NotifyPropertyChanged("B");
        }

        (...) // INotifyPropertyChanged implementation
    }
};