2012-03-26 2 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 свойству высшего класса. Моя проблема в том, что я не могу понять, как запустить событие PropertyChanged для IsInnerTrue, когда свойство IsTrue одного из объектов Inner меняет значение.

Есть ли у кого-нибудь предложение, если не настроить обработчик событий для каждого Внутреннего объекта?

+3

Это именно то, что вам нужно сделать. Подпишитесь на PropertyChanged на каждом внутреннем и отреагируйте соответствующим образом. – GazTheDestroyer

+0

Согласовано. Также используйте IsInnerTrue {get {return innerList.All (IsTrue); } – Phil

+0

Спасибо. Я надеялся на менее сложный способ сделать это. –

ответ

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, и уволит событие изменения свойства верхнего уровня, когда изменяется внутреннее свойство.

Смежные вопросы