1

我正在尝试学习 MVVM 模式,特别是当视图表示数据库表时该怎么做,但视图有几个元素表示单个数据库字段。举个简单的例子:

假设我有一个 DateTime 类型的数据库字段(每个数据库字段都有一个属性的类),但在视图中,我有一个用于日期组件的日期选择器和一个用于时间组件的 TimeSpan。

在 MVC 模式中,我总是有一个 POCO 模型,它包含一个可以为空的 DateTime 属性用于日期选择器和一个可以为空的 TimeSpan 属性用于时间。我会将数据库类映射到模型。

在 MVVM 模式中,我可以包装表示数据库字段的类,并在设置访问器上设置逻辑,使包装的类 DateTime 属性保持同步(并且由于 2 个字段可以为空,视图模型中的私有 DateTime 和 TimeSpan 字段,仅设置如果日期和时间都不为空,则为数据库类 Datetime 属性)

或者,我可以让 viewmodel 包装一个更像 MVC 模型的模型 - 即一个 POCO 模型,其中日期和时间组件表示单独的属性。然后,视图模型变成了一个更简单的包装器,它实现了 INotifyPropertyChanged,以及一个保存 ICommand,它仅在创建或更新数据库类的实例时添加日期和时间跨度。

显然,这两种方法都“有效”,但是什么会被认为是更好的实践和/或最符合 MVVM 架构的方法。谢谢你。

4

2 回答 2

1

当您实现 INotifyPropertyChanged 时,事件就会出现,这在 MVVM 中是不可取的,因为您的应用程序可能会遇到控件在不同线程上更新其值的问题。

如果您使用第一种方法会更好。

于 2013-10-14T13:16:49.103 回答
0

我最终将日期从数据库模型映射并拆分到映射模型,因为它更好地向用户发送验证消息(模型实现了 IDataErrorInfo)。因为我有一个 DateTime 需要在现在之前,我可以将模型中的验证拆分为:

如果日期在今天之后 -> 返回字符串“不能使用比今天晚的日期”

否则,如果存在日期但缺少时间 -> 返回字符串“请输入时间”

else if DateTime after now ->return string "Can't be later than the current date and time"

第二种方法将涉及在 2 个看起来很愚蠢的类之间共享简单的相关验证逻辑。

于 2013-10-16T07:18:29.273 回答