为了展示模型和视图模型之间可能存在的关系,我首先简化了您的示例,将
Occupation
的类型更改为
string
。然后,
PersonModel
和
PersonViewModel
可能如下所示:
public class PersonModel : INotifyPropertyChanged
{
private string occupation;
public string Occupation
{
get
{
return this.occupation;
}
set
{
if (this.occupation != value)
{
this.occupation = value;
this.OnPropertyChanged("Occupation");
}
}
}
}
public class PersonViewModel: INotifyPropertyChanged
{
private PersonModel model;
public string Occupation
{
get
{
return this.model.Occupation;
}
set
{
this.model.Occupation = value;
}
}
public PersonViewModel(PersonModel model)
{
this.model = model;
this.model.PropertyChanged += new PropertyChangedEventHandler(model_PropertyChanged);
}
private void model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.OnPropertyChanged(e.PropertyName);
}
}
您的版本与此版本的重要区别在于,
PersonModel
和
PersonViewModel
都实现了
INotifyPropertyChanged
接口。这很重要,否则直接更改
PersonModel
的属性(即不通过
PersonViewModel
)将不会在视图中产生任何影响。请注意,模型中的
PropertyChangedEvent
被传递到了视图中。
现在假设
Occupation
不是一个
string
,而是一个具有自己属性的类,例如:
public class OccupationModel : INotifyPropertyChanged
{
private double salary;
public double Salary
{
get
{
return this.salary;
}
set
{
if (this.salary != value)
{
this.salary = value;
this.OnPropertyChanged("Salary");
}
}
}
}
在视图和模型之间使用ViewModel可以使数据呈现到视图的方式更加灵活。以下是两种可行的方案:
方案1:直接在PersonViewModel
中公开Occupation
的属性。这是一种简单的解决方案,因为您不需要实现另一个ViewModel。
public class PersonViewModel: INotifyPropertyChanged
{
private PersonModel model;
public double OccupationSalary
{
get
{
return this.model.Occupation.Salary;
}
set
{
this.model.Occupation.Salary = value;
}
}
public PersonViewModel(PersonModel model)
{
this.model = model;
this.model.Occupation.PropertyChanged += new PropertyChangedEventHandler(occupation_PropertyChanged);
}
private void occupation_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.OnPropertyChanged("Occupation" + e.PropertyName);
}
}
OccupationSalary
属性直接访问
Occupation
中的
Salary
属性。需要注意的是,现在必须处理
Occupation
的
PropertyChanged
事件,并且我们必须将属性重命名为
occupation_PropertyChanged
。
选项2(推荐)通过
OccupationViewModel
公开
Occupation
的属性。如果您需要实现特定于
Occupation
的业务逻辑,则应执行此操作。根据您的示例,这可能是您想要执行的操作:
public class PersonViewModel: INotifyPropertyChanged
{
private PersonModel model;
private OccupationViewModel occupationViewModel;
public OccupationViewModel OccupationViewModel
{
get
{
return this.occupationViewModel;
}
}
public PersonViewModel(PersonModel model)
{
this.model = model;
this.occupationViewModel = new OccupationViewModel(this.model.occupation);
}
}
public class OccupationViewModel : INotifyPropertyChanged
{
private OccupationModel model;
public double Salary
{
get
{
return this.model.Salary;
}
set
{
this.model.Salary = value;
}
}
public OccupationViewModel(OccupationModel model)
{
this.model = model;
this.model.PropertyChanged += new PropertyChangedEventHandler(model_PropertyChanged);
}
private void model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.OnPropertyChanged(e.PropertyName);
}
}
正如你所看到的,OccupationViewModel
与我在开头展示的简化版PersonViewModel
结构完全相同。与你版本的OccupationViewModel
的重要区别在于它公开了OccupationModel
的属性,而不是OccupationModel
本身。
personViewModel.Occupation.Occupation = new OccupationModel("软件工程师");
- Jay