你可以使用任何你觉得舒服的模型,是的,你的所有属性都需要 INotifyPropertyChanged 行为。这将如何影响服务层完全取决于您的实现。
我假设您认为您认为绑定到您的 DTO?
我的看法是应用程序的各层之间存在阻抗不匹配,即您的域模型可能看起来与您的关系模型相似,但存在细微但至关重要的差异。域模型和您的 DTO 之间也存在不匹配(对象可能是扁平化的、计算的属性等……)。直接绑定到 DTO 很诱人,因为它们可能被设计为具有特定操作所需的内容,但是 DTO 与视图为实现预期结果所需的内容之间也存在阻抗不匹配。这就是视图模型的用武之地。视图模型负责将 DTO 属性代理到视图,它负责让视图知道是否存在验证错误,并将命令路由到适当的处理程序(保存、删除等) , ..
我倾向于通过以下方式进行设置:
// POCO object. Serializable.
public class AddressDto
{
public int Id { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
// IDataErrorInfo for validation.
public class AddressViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private readonly AddressDto addressDto;
public AddressViewModel(AddressDto addressDto)
{
this.addressDto = addressDto;
}
public int Id { /* get and set for property changed event and update dto */ }
public string Street { /* get and set for property changed event and update dto */ }
public string City { /* get and set for property changed event and update dto */ }
public string Country { /* get and set for property changed event and update dto */ }
...
// IDataErrorInfo implementation
}
public class EditAddressViewModel : INotifyPropertyChanged
{
public AddressViewModel Address { /* get and set for property changed event */ }
public ICommand Save { /* setup command */ }
public ICommand Cancel { /* setup command */ }
private void Save()
{
}
private void Cancel()
{
}
}
然后您的 EditAddressView 将绑定到 EditAddressViewModel。基本上规则是你所有的 UI 行为都应该用你的视图模型来表达。
是的,这确实意味着额外的工作,但是您可以做一些事情来简化一些事情(代码生成等)。我实际上正在开发一个旨在使用流利的 api 简化整个 MVVM 过程的库。在http://fluentviewmodel.codeplex.com/上查看