对于我的 WPF 应用程序,我决定使用 MVVM。这是我将如何实现这种模式的概念。
我的第一个问题是关于在 ViewModel 中包装或不包装我的模型。
ViewModel 出于各种原因应该包装模型:
我不喜欢直接绑定到 Model (DateTime, int, ...) 中的强类型属性,因为当我这样做时 => WPF 会控制我对这些类型的验证。这真的很糟糕,因为当用户在 Datepicker 中写入 'aaaa' 时,我的模型是有效的(我的模型从不知道这一点,因为 WPF 控制强类型属性)并且启用了保存按钮 - 这真的是错误的。
我没有向视图公开我的模型的所有属性,我ViewModel应该保护我的模型(我有一些属性,应该在表示层只有 getter 而没有 setter)
我的决定是ViewModel绝对应该包装模型。所以ViewModel工具INotifyPropertyChanged。
但是现在我在业务验证方面遇到了问题。
当我使用漂亮的 IDataErrorInfo 时,我在 ViewModel 中拥有整个业务规则,这打破了我的概念。业务规则绝对应该在模型中。
示例:当用户选择类型 A 时,则字段 1 和字段 2 为必填项。当用户选择类型 B 时,字段 3 是必填项——该字段应标记为红色,并且在无效时禁用保存按钮。还有更重的东西,比如空闲/占用的 DateTime-Ranges。
当我在 ViewModel 中做这些事情时,这绝对是糟糕的,因为大多数事情都是业务部分。
那么我如何才能做到这一点?
目前我有这个解决方法:
所有ValidationRules都在模型中作为简单的方法,例如
public string ValidateBirthday(string birthay)
{
if …Run Code Online (Sandbox Code Playgroud)