我正在构建一个基于 MVVM 的应用程序。我已经解决了大部分设计问题,但我还剩下一个概念上至关重要的问题:我的 ViewModel 或我的 Model 是否应该包含 Model 模型的状态?
最初我认为模型应该包含它自己的状态,但事实证明,在将状态传递给 ViewModel(它具有模型状态的 90%)时涉及到很多样板。
然后我想将整个状态从模型移动到视图模型,但这并不适合我,因为我在概念上认为视图模型具有视图的状态而不是模型的状态。
什么是最被接受的放置状态的地方?
我正在构建一个基于 MVVM 的应用程序。我已经解决了大部分设计问题,但我还剩下一个概念上至关重要的问题:我的 ViewModel 或我的 Model 是否应该包含 Model 模型的状态?
最初我认为模型应该包含它自己的状态,但事实证明,在将状态传递给 ViewModel(它具有模型状态的 90%)时涉及到很多样板。
然后我想将整个状态从模型移动到视图模型,但这并不适合我,因为我在概念上认为视图模型具有视图的状态而不是模型的状态。
什么是最被接受的放置状态的地方?
您正确感知具有视图状态的 ViewModel。从概念上讲,模型的状态是模型的一部分,但它可能会因您的特定场景而异。将模型视为数据:作为可以序列化的东西,可以来自服务器和/或可以/应该保存在数据库中。
例如,如果您有一个购物车,那么运输车中的物品显然是模型的一部分。但是,结帐过程中的状态(已收到付款方式、已验证付款方式、已确认用户)可以采用任何一种方式。
至于样板 - 对我来说具有合理数量的样板的范式包含(实际上,在 c# 中引用)ViewModel 中的整个模型,并为模型中的所有属性公开 getter 和 setter,适当的甚至通知。例如
class PersonModel {
public string firstName { get; set; }
public string lastName { get; set; }
}
class PersonViewModel : INotifyPropertyChanged {
private PersonModel model;
// next 4 lines can be factored out to a BaseViewModel class
private PropertyChangedEventHandler PropertyChanged;
private raise(string propName) {
this.PropertyChanged( new PropertyChangedEventArgs(propName) );
}
// ... repeat for each property in the model
public string firstName {
get { return model.fistName; }
set { model.firstName = value; raise('firstName'); }
}
public string lastName {
get { return model.lastName; }
set { model.lastName = value; raise('lastName'); }
}
}