1

我有一個Windows Phone 8應用程序使用Fody將INotifyPropertyChanged注入到屬性中。 我有類先用屬性A,其被綁定到文本框在檢視:屬性取決於另一個類的屬性

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

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

和類二具有取決於屬性的屬性B(也綁定到文本框):

[ImplementPropertyChanged] 
public class Second 
{ 
    private First first; 

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

更新A和AA工作正常,但B不會在first.A更改時自動更新。有沒有一種簡單而乾淨的方式來實現這種自動更新使用fody還是我必須創建自己的事件來處理它?

回答

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 
    } 
}; 
1

我對Fody並不熟悉,但我懷疑這是因爲Second.B上沒有setter。第二應預訂在第一的變更,如果First.A正在發生變化的屬性,則應該使用(私有)二傳手B.

或者訂閱第一,然後調用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"); 
     } 
} 
+0

安裝程序不需要更新視圖。我在First中添加了屬性AA,當A更改時它會更新得很好。 我要求的是Fody的功能,以避免在第二個中創建手動訂閱。 –

+0

其實看着Fody它是必需的。在擁有類的情況下,它只是自動注入到代碼中:https://github.com/Fody/PropertyChanged – SKall

+0

但是,我之前見過,但是,這並不能解決我的問題。 當然,我可以添加一個事件並通過設置B來強制更新來處理它,但不幸的是,該解決方案不可擴展。 –

相關問題