2012-04-30 5 views
1

모델 클래스 B의 목록을 포함하는 모델 클래스 A를 사용합니다. 각 모델 (A 및 B)은 INotifyPropertyChanged를 구현하며 적절한 변경시 이벤트가 올바르게 발생합니다. 모델 A는 모델 B에서이 이벤트를 구독하고 모델 A가 발생하면 다른 속성이 변경됩니다.모델에서 Mvvm 중첩 된 속성

내 문제는 데이터베이스에 변경 사항을 기록해야하는 서비스 클래스에서 모델 A (변경된 모델 속성 포함) 내의 변경 사항을 듣고 싶습니다. 모델 A는 화재가하여 PropertyChanged 때, 내 서비스 클래스에서 나는 변경 속성이 A 또는

public class Model B : ObservableObject 
{ 
... 
    public int Property1 
    { 
    get{return property1;} 
    set{ this.property1 = value; 
     OnPropertyChanged("Property1"); 
     } 
    } 
} 


public class ModelA : ObservableObject 
{ 
... 
ObservableCollection<ModelB> modelsB; 
... 

public ObservableCollection<ModelB> ModelsB 
{ 
    get 
    { 
    if(modelsB == null) 
    { 
     this.modelsB = new ObservableCollection<ModelB>(); 
     this.modelsB.CollectionChanged+= ModelBListChanged; 
    } 
    return modelsB; 
    } 
} 


    private int property2; 
    public int Property2 
    { 
    get{return property2;} 
    set{ this.property2 = value; 
     OnPropertyChanged("Property2"); 
     } 
    } 

private void ModelBListChanged(object sender, NotifyCollectionChangedEventArgs args) 
{ 
    if(e.NewItems != null) 
     { 
     foreach(ObservableObject item in e.NewItems) 
     { 
      item.PropertyChanged += NotifyPropertyChanged; 
     } 
     } 
     if (e.OldItems != null) 
     { 
     foreach (ObservableObject item in e.OldItems) 
     { 
      item.PropertyChanged -= NotifyPropertyChanged; 
     } 
     } 
} 

... 

} 


public class SomeService 
{ 
    ... 

    ObservableCollection<ModelA> modelsA; 

    public ObservableCollection<ModelA> ModelsA 
    { 
    get 
    { 
     if(modelsA == null) 
     { 
     modelsA = new ObservableCollection<ModelA>(); 

      //fill with data... 
     .... 
     foreach(...) 
     { 
     ModelB mb = new ModelB(); 
      //fill mb ... 
     ... 

     mb.PropertyChanged += ModelBChanged; 
     modelsA.ModelsB.Add(mb); 
     } 
     .... 
     modelsA.PropertyChanged += ModelsAChanged; 
     } 
     return modelsA; 
    } 
    } 

    ... 

    private void ModelsAChanged(object sender, PropertyChangedEventArgs args) 
    { 
    // determine the property that has changed and call the correct 
    // update function for this property to write the data to database. 

var ma = (ModelA) sender; 

     switch(args.PropertyName) 
     { 
    ... 
     case ModelA.Property1: 
      //update database with function for property 1 
      break; 
     case ModelA.Property2: 
      //update database with function for property 2 
      break; 
    ... 
     } 
    } 

    private void ModelBChanged(object sender, PropertyChangedEventArgs args) 
    { 
    // How do I know to which ModelA this ModelB sender belongs? 

var mb = (ModelB) sender; 
switch(args.PropertyName) 
     { 
    ... 
     case ModelB.Property1: 
      //update database with function for property 1 of model B 
      break; 
     ... 
     } 
    } 
} 

방법이가 해결 될 수있는 모델 B의 하나의 모델에 속하는지 알 수없는 이유는 무엇입니까?

감사합니다,

tabina

답변

1

나는 당신의 현재 코드도 컴파일 확실하지 않다? B 컬렉션의 CollectionChanged 이벤트를 A 클래스의 PropertyChanged 이벤트로 바꾸고 있지만 NotifyCollectionChangedEventArgs에 존재하지 않는 PropertyName을 참조하고 있습니다.

작동시킬 수 있다고해도 CollectionChanged 이벤트는 여러 항목을 참조 할 수 있지만 PropertyChanged은 하나만 참조합니다.

B 컬렉션은 이미 A의 공개 자산입니다. 서비스 변경 사항을 직접 구독 할 수없는 이유는 무엇입니까? 예.

public class SomeService 
{ 
    ObservableCollection<ModelA> modelsA; 

    public ObservableCollection<ModelA> ModelsA 
    { 
     get 
     { 
      if(modelsA == null) 
      { 
       modelsA = new ObservableCollection<ModelA>(); 
       //fill with data... 

       modelsA.CollectionChanged += ModelsAChanged; 

       foreach (ModelA A in modelsA) 
        A.ModelsB.CollectionChanged += ModelsBChanged; 
      } 

      return modelsA; 
     } 
    } 

    private void ModelsAChanged(object sender, NotifyCollectionChangedEventArgs args) 
    { 
     //remember to subscribe to ModelsB in any new ModelA instance that get added 
     //to the modelsA collection too, and unsubscribe when they get removed. 
    } 

    private void ModelsBChanged(object sender, NotifyCollectionChangedEventArgs args) 
    { 

    } 
} 
+0

맞아. CollectionChanged가 아닌 PropertyChangedEvent 여야합니다. 나는이 게시물을 타이핑하는 것을 섞었다. – tabina

+0

위 코드를 업데이트했습니다. – tabina