WPF中的MVVM - 一些不确定性

时间:2013-10-29 20:40:20

标签: c# wpf mvvm

我上次一直在处理WPF而且我正在尝试理解MVVM,但是存在一些不确定性:数据在模型内部,View与视图模型绑定,对吧?但是,模型中是否只有数据,或者它是否合法,例如保存方法或从模型内部的数据库中获取数据的方法?

接下来是:我绑定了View Model,显然在View Model中有一个Model实例。所以我再次在View Model中封装了Model实例中的数据,所以我可以绑定它,尽管数据已经封装在Model中了?我看到了几个实现,它们在View Model中包含了主要数据,并封装了View Model中的字段,而不是模型中的字段,那么如何以正确的方式完成呢?

第三个不确定性是:验证数据的常用方法是什么?在具有IDataErrorInfo的模型内部或在View Model的封装内部?我在互联网上发现了几个MVVM模式的实现,其中一些与下一个实现差异很大,我不确定如何管理这些东西。

1 个答案:

答案 0 :(得分:2)

  

数据在模型中,视图绑定到视图模型,对吗?

这是一般的想法,但“模型”并不总是一个明确定义的单一实体。

  

但是,模型中是否只有数据,或者它是否合法,例如保存方法或从模型内部的数据库中获取数据的方法?

可能存在由模型和/或视图模型封装的数据和数据服务的组合。

逻辑通常通过视图模型公开的命令启动。这些命令可以将实际工作交给其他服务,或者工作可以完全在View Model中完成,或者可能在Model中完成,具体取决于您的设计。

视图模型倾向于封装与数据表示相关的逻辑,例如管理诸如项目选择之类的事物。与加载,保存和查询数据相关的逻辑通常由视图模型启动,其形式是调用执行大部分实际工作的某些服务。

  

所以我再次在View Model中封装了Model实例中的数据,所以我可以绑定它,尽管数据已经封装在Model中了?我看到了几个实现,它们在View Model中包含了主要数据,并封装了View Model中的字段,而不是模型中的字段,那么如何以正确的方式完成呢?

“Model”是MVVM模式中定义最松散的组件。通常,开发人员不会打扰两层封装,“模型”简单地用来表示“数据”,它由View Model公开/封装。这可能与您看到的代码一致。我倾向于认为这很好,只要你的数据是“MVVM友好的”,例如,它实现INotifyPropertyChanged,支持验证(如果需要),等等。如果你不“拥有”设计/结构数据和数据不太适合直接绑定,您最终可能会为您的数据创建“包装”模型(实际上,迷你视图模型)。根据我的经验,这通常是不必要的。

  

验证数据的常用方法是什么?在具有IDataErrorInfo的模型内部或在View Model的封装中?

最方便的解决方案是针对您要绑定的对象实现IDataErrorInfo,因为这简化了与WPF数据绑定系统的集成。通常这意味着模型(可能只是“数据”,取决于您的设计)。