我正在寻找一些关于如何解决目前困扰我们的问题的建议。
假设我们有几个业务对象(POCO),如
public class UserGroup
{
public virtual ICollection<Person> People { get; set; }
}
public class Person
{
public virtual ICollection<Adress> Adresses { get; set; }
}
public class Adress
{
public virtual string StreetName { get; set; }
}
这有点过分了,但我希望它足以让你明白这一点。 UserGroup 包含 Person 实例的集合,每个 Person 实例都包含 Address 实例的集合。
UserGroup POCO的ViewModel可能如下所示:
public class UserGroupViewModel
{
private UserGroup userGroupModel;
public UserGroup UserGroupModel
{
get { return this.userGroupModel; }
set
{
this.userGroupModel = value;
this.PeopleViewModelCollection =
new ObservableCollection<PeopleViewModel>();
foreach (Person p in this.UserGroupModel.People)
{
var personViewModel = new PersonViewModel();
personViewModel.PersonModel = p;
this.PeopleViewModelCollection.Add(personViewModel);
}
}
}
public ObservableCollection<PersonViewModel> PersonViewModelCollection
{
get;
set;
}
}
Person POCO的ViewModel可能如下所示:
public class PersonViewModel
{
private Person personModel;
public Person PersonModel
{
get { return this.personModel; }
set
{
this.personModel = value;
this.AddressViewModelCollection =
new ObservableCollection<AddressViewModel>();
foreach (Address a in this.PersonModel.Adresses)
{
var addressViewModel = new AddressViewModel();
addressViewModel.AddressModel = a;
this.AdressViewModelCollection.Add(addressViewModel);
}
}
}
public ObservableCollection<AddressViewModel> AddressViewModelCollection
{
get;
set;
}
}
同样它过于简单化,但我想要展示的是ViewModels具有嵌套在其中的其他ViewModel的ObserableCollections。
相应Model属性的setter,例如PersonViewModel.PersonModel
会为Person
的所有地址创建ViewModel,并将其添加到ObservableCollection<AdressViewModels> AdressViewModelCollection
的{{1}}属性中。
此时我们可以使用此代码在View中显示这些ViewModel。我们可以例如显示PersonViewModel
的{{1}}的{{1}}。
现在删除StreetName
的{{1}}时应该怎么做?从Person
中删除Adress
将更新GUI,但实际上不允许更新基础模型。
类似于向Adress
模型添加其他Person
时,现有的ViewModel不会反映此更改,因为AdressViewModel
只会在PersonViewModel.AdressViewModelCollection
后重建}属性再次设置。
是否有一种(最好是简单的)方法来实现ViewModel和Model之间的这种双向更新?或者这可能是不可取的,最好以完全不同的方式处理这个问题?
我很想听到关于这个问题的不同意见!
修改
我想声明我们的模型类是由Entity Framework 4.0生成的,并且是POCO(参见上面的业务对象示例)。我不确定问题本身是否足够清楚。我们希望将导航属性(例如Adress
)公开为Person
。
答案 0 :(得分:1)
您可以使用动态代理简化事务(例如Castle.Proxy),请查看此post以了解如何实现此目标。
答案 1 :(得分:0)
听起来这不是问题的级联。这是模型和视图模型之间的同步。
您需要收听observable collections collectionchanged事件,并提供实现here。
我认为您唯一的选择是在模型中实现INotifyPropertyChanged,因为实体框架不提供更新ViewModel的方法。