1

我有一个使用 Fody 将 INotifyPropertyChanged 注入属性的 Windows Phone 8 应用程序。我有属性 A 的 Class First,它绑定到 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 工作正常,但是当 first.A 更改时 B 不会自动更新。是否有一种简单而干净的方法可以使用 fody 实现这种自动更新,还是我必须创建自己的事件来处理它?

4

2 回答 2

1

我对 Fody 不熟悉,但我怀疑这是因为 Second.B 上没有二传手。Second 应该订阅 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");
        }
}
于 2014-01-06T00:10:59.213 回答
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
    }
};
于 2014-02-18T10:35:44.393 回答