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

时间:2011-02-02 09:33:11

标签: 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; }
}

这有点过分了,但我希望它足以让你明白这一点。 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

2 个答案:

答案 0 :(得分:1)

您可以使用动态代理简化事务(例如Castle.Proxy),请查看此post以了解如何实现此目标。

答案 1 :(得分:0)

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

您需要收听observable collections collectionchanged事件,并提供实现here

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