【发布时间】:2011-01-04 20:11:47
【问题描述】:
这似乎是一个基本问题,但我无法找出最佳实施方案。您如何管理两个视图模型及其对应模型之间的关系。
例如,如果您更改了 PersonViewModel 上的 Occupation 属性,那么该更改如何影响到 PersonModel 中的 Occupation 属性。
我现在唯一能看到它的方法是在视图模型中公开展示模型,但我认为这违背了 MVVM 的目的 - 将模型与视图解耦。
internal class PersonViewModel : INotifyPropertyChanged
{
private readonly PersonModel person;
private OccupationViewModel occupation;
public PersonViewModel(PersonModel person)
{
this.person = person;
}
public OccupationViewModel Occupation
{
get { return this.occupation; }
set
{
if (!this.occupation.Equals(value))
{
this.occupation = value;
this.person.Occupation = this.occupation.Occupation; // Doesn't seem right
this.OnPropertyChanged(new PropertyChangedEventArgs("Occupation"));
}
}
}
}
internal class OccupationViewModel : INotifyPropertyChanged
{
public OccupationViewModel(OccupationModel occupation)
{
this.Occupation = occupation;
}
public OccupationModel Occupation { get; set; } // Is this right?
}
internal class PersonModel
{
public OccupationModel Occupation { get; set; }
}
【问题讨论】:
-
为什么 PersonViewModel.Occupation 是可写属性?通常它是只读的——毕竟,谁来设置它?
-
我正在考虑公开它,以便其他视图模型可以更改它。或者这是一些方法或命令的来源?顺便说一句,我是 WPF、MVVM 新手。
-
Patrick 我认为 Joe 的意思是可以在外部修改视图模型而无需设置它(通过访问其属性):
personViewModel.Occupation.Occupation = new OccupationModel("software engineer"); -
...此外,除非 (a) 您正在评论他们的答案,(b) 他们已为该问题加注星标/收藏,或 (c) 您引导至少有一部分名字以“@”开头的问题——比如“@Joe 我在想……”
-
@Jay,在某些情况下您不希望直接设置视图模型吗?我在考虑视图模型有很多属性的情况。在我看来,设置属性(“PersonViewModel.Occupation”)比遍历所有属性并更改它们更容易。你怎么看?