2012-03-26 103 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,并在内部属性更改时触发顶级属性更改事件。