数据在模型内部,视图绑定到视图模型,对吧?
这是一般的想法,但“模型”并不总是一个单一的、明确定义的实体。
但是,模型中真的只有数据吗,或者拥有例如保存方法或从模型中的数据库中获取数据的方法是否合法?
模型和/或视图模型可能封装了数据和数据服务的组合。
逻辑通常通过视图模型公开的命令启动。这些命令可能会将实际工作交给其他服务,或者工作可能完全在 View Model 中完成,或者可能在 Model 中完成,具体取决于您的设计。
视图模型倾向于封装与数据表示相关的逻辑,例如,管理诸如项目选择之类的事情。与加载、保存和查询数据相关的逻辑通常由View Model 以调用执行大部分实际工作的某些服务的形式启动。
所以我再次将模型实例中的数据封装在视图模型中,所以我可以绑定到它,尽管数据已经封装在模型中?我看到了几个实现,它们在视图模型中包含主要数据,并封装了视图模型内部而不是模型内部的字段,那么如何正确地做到这一点呢?
“模型”是 MVVM 模式中定义最松散的组件。通常,开发人员不会为两层封装而烦恼,“模型”只是简单地表示“数据”,它由视图模型公开/封装。这可能与您看到的代码一致。我倾向于认为这很好,只要您的数据是“MVVM 友好的”,例如,它实现INotifyPropertyChanged
、支持验证(如果需要)等。如果您不“拥有”数据的设计/结构,以及data 不太适合直接绑定,您最终可能会为您的数据创建“包装器”模型(实际上是迷你视图模型)。根据我的经验,这通常是不必要的。
验证数据的常用方法是什么?在带有 IDataErrorInfo 的模型内部还是在视图模型的封装内部?
最方便的解决方案是让您绑定的对象实现IDataErrorInfo
,因为这简化了与 WPF 数据绑定系统的集成。通常这意味着模型(可能只是“数据”,具体取决于您的设计)。