2012-03-26 94 views
3

我有下面的類結構的PropertyChanged嵌套類結構

class Top : NotifyPropertyChanged 
{ 
    private List<Inner> innerList; 

    public bool IsInnerTrue 
    { 
     get 
     { 
      foreach (Inner inner in innerList) 
      { 
      if (inner.IsTrue) 
       return true; 
      } 
      return false; 
     }; 
    } 
} 

class Inner : NotifyPropetyChanged 
{ 
    private bool isTrue; 
    public bool IsTure 
    { 
     get 
     { 
     return isTrue; 
     } 
     set 
     { 
     isTrue = value; 
     NotifyPropretyChanged("IsTrue");  
     } 
    } 
} 

在我看來,我結合了頂級的IsInnerTrue財產。我的問題是,我無法弄清楚當一個Inner對象的IsTrue屬性改變值時如何觸發IsInnerTrue的PropertyChanged事件。

有沒有人有建議,缺少設置每個內部對象的事件處理程序?

+3

這正是你需要做的。在每個內部訂閱PropertyChanged並作出相應的反應。 – GazTheDestroyer 2012-03-26 15:36:23

+0

同意。同樣使用IsInnerTrue {get {return innerList.All(IsTrue); } – Phil 2012-03-26 15:39:25

+0

謝謝。我希望有一個不那麼複雜的方法。 – 2012-03-26 16:01:11

回答

3

這裏有兩個選項。一,訂閱內的PropertyChanged事件:

class Top : NotifyPropertyChanged 
{ 
    private List<Inner> innerList = new List<Inner>(); 

    public bool IsInnerTrue 
    { 
     get 
     { 
      foreach (Inner inner in innerList) 
      { 
       if (inner.IsTrue) 
        return true; 
      } 
      return false; 
     } 
    } 

    public void Add(Inner inner) 
    { 
     innerList.Add(inner); 
     inner.PropertyChanged += InnerPropertyChanged; 
    } 

    public void Remove(Inner inner) 
    { 
     innerList.Remove(inner); 
     inner.PropertyChanged -= InnerPropertyChanged; 
    } 

    private void InnerPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "IsTrue") 
      RaisePropertyChanged("IsInnerTrue"); 
    } 
} 

或兩個,使用依賴性跟蹤庫像Update Controls。這些庫可以檢測到IsInnerTrue依賴於IsTrue,並在內部屬性更改時觸發頂級屬性更改事件。