모델 클래스 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
맞아. CollectionChanged가 아닌 PropertyChangedEvent 여야합니다. 나는이 게시물을 타이핑하는 것을 섞었다. – tabina
위 코드를 업데이트했습니다. – tabina