2012-03-26 4 views
3

Ich habe die folgende KlassenstrukturProperty für verschachtelte Klassenstruktur

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");  
     } 
    } 
} 

Aus meiner Sicht ich auf die IsInnerTrue Eigenschaft der Top-Klasse bin verbindlich. Mein Problem ist, dass ich nicht herausfinden kann, wie das PropertyChanged-Ereignis für IsInnerTrue ausgelöst wird, wenn die IsTrue-Eigenschaft eines der Inner-Objekte den Wert ändert.

Hat jemand einen Vorschlag, kurz einen Event-Handler für jedes Inner-Objekt einzurichten?

+3

Das ist genau das, was Sie tun müssen. Abonniere PropertyChanged auf jedem Inneren und reagiere dementsprechend. – GazTheDestroyer

+0

Einverstanden. Verwenden Sie auch IsInnerTrue {get {return innerList.All (IsTrue); } – Phil

+0

Danke. Ich habe auf einen weniger komplexen Weg gehofft. –

Antwort

3

Hier sind zwei Optionen. Einer, abonnieren Sie den inneren Property Ereignisse:

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"); 
    } 
} 

Oder zwei, verwenden Sie eine Abhängigkeit Tracking-Bibliothek wie Update Controls. Diese Bibliotheken können erkennen, dass IsInnerTrue von IsTrue abhängt, und werden das geänderte Ereignis der obersten Ebene auslösen, wenn sich die innere Eigenschaft ändert.