我正在寻找一些关于如何解决目前困扰我们的问题的建议.
假设我们有几个业务对象(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; }
}
Run Code Online (Sandbox Code Playgroud)
这有点简单,但我希望它足以让你明白这一点.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;
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
同样它过于简单了,但我想要展示的是ViewModels具有嵌套在其中的其他ViewModel的ObserableCollections.
相应Model属性的setter,例如PersonViewModel.PersonModel,为它的所有地址创建ViewModel Person,并将它们添加到the ObservableCollection<AdressViewModels> AdressViewModelCollection属性中PersonViewModel.
此时我们可以使用此代码在View中显示这些ViewModel.我们可以例如显示StreetNamea Person的Adress.
现在删除Adressa 时应该怎么做Person?AdressViewModel从PersonViewModel.AdressViewModelCollection将删除将更新GUI但它实际上不允许更新基础模型.
与此类似,如果您将另一个添加Adress到Person模型中,现有的ViewModel将不会反映此更改,因为PersonViewModel.AdressViewModelCollection只有在PersonViewModel.PersonModel再次设置该属性时才会重建.
是否有一种(最好是简单的)方法来实现ViewModel和Model之间的这种双向更新?或者这可能是不可取的,最好以完全不同的方式处理这个问题?
我很想听到关于这个问题的不同意见!
编辑:
我想声明我们的模型类是由Entity Framework 4.0生成的,并且是POCO(参见上面的业务对象示例).我不确定问题本身是否足够清楚.我们希望将导航属性(例如Person.Addresses)公开为ICollection<T>.