如何在模型更改时更新MVVM嵌套ViewModels,反之亦然?

Tim*_*sig 5 c# mvvm

我正在寻找一些关于如何解决目前困扰我们的问题的建议.

假设我们有几个业务对象(PO​​CO)

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 PersonAdress.

现在删除Adressa 时应该怎么做PersonAdressViewModelPersonViewModel.AdressViewModelCollection将删除将更新GUI但它实际上不允许更新基础模型.

与此类似,如果您将另一个添加AdressPerson模型中,现有的ViewModel将不会反映此更改,因为PersonViewModel.AdressViewModelCollection只有在PersonViewModel.PersonModel再次设置该属性时才会重建.

是否有一种(最好是简单的)方法来实现ViewModel和Model之间的这种双向更新?或者这可能是不可取的,最好以完全不同的方式处理这个问题?

我很想听到关于这个问题的不同意见!

编辑: 我想声明我们的模型类是由Entity Framework 4.0生成的,并且是POCO(参见上面的业务对象示例).我不确定问题本身是否足够清楚.我们希望将导航属性(例如Person.Addresses)公开为ICollection<T>.

kev*_*aub 1

听起来问题不在于级联。这是模型和视图模型之间的同步。

您需要监听可观察集合 collectionchanged 事件,这里提供了一个实现。

我认为您唯一的选择是在模型中实现 INotifyPropertyChanged,因为实体框架不提供更新 ViewModel 的方法。