Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MVVM体系结构中的模型与MVC的比较_Mvvm - Fatal编程技术网

MVVM体系结构中的模型与MVC的比较

MVVM体系结构中的模型与MVC的比较,mvvm,Mvvm,我试图学习MVVM模式,特别是当视图表示数据库表,但视图有几个元素表示单个数据库字段时,该怎么办。举个简单的例子: 假设我有一个DateTime类型的数据库字段(每个数据库字段有一个属性的类),但在视图中,我有一个datepicker用于日期组件,一个TimeSpan用于时间组件 在MVC模式中,我总是有一个POCO模型,其中包含日期选择器的可空DateTime属性和时间选择器的可空TimeSpan属性。我将把数据库类映射到模型 在MVVM模式中,我可以包装表示数据库字段的类,并在集合访问器上设

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

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

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

在MVVM模式中,我可以包装表示数据库字段的类,并在集合访问器上设置逻辑,以保持包装类DateTime属性的同步(由于这两个字段可为空,因此viewmodel中的private DateTime和TimeSpan字段仅在date和time都不为空时设置数据库类DateTime属性)

或者,我可以让viewmodel包装一个更像MVC模型的模型,即POCO模型,其中日期和时间组件表示不同的属性。然后,viewmodel变成了一个简单得多的包装器,它实现了INotifyPropertyChanged,还有一个save ICommand,它只在创建或更新数据库类实例时添加日期和时间跨度


显然,这两种方法都“有效”,但什么是更好的实践和/或最符合MVVM体系结构的呢。谢谢。

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


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

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


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

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

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

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

否则如果DateTime after now->返回字符串“不能晚于当前日期和时间”


第二种方法是在两个类之间共享简单的、相关的验证逻辑,这似乎很愚蠢。

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

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

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

否则如果DateTime after now->返回字符串“不能晚于当前日期和时间”


第二种方法是在两个类之间共享简单的、相关的验证逻辑,这似乎很愚蠢。

谢谢你的时间,但我一点也不明白(为什么viewmodel不应该实现INotifyPropertyChanged,或者.net中的简单桌面应用程序最终会使用多个线程,除非我专门设计了多个线程)您能提供一个参考吗?请参考以下链接谢谢您的时间,但我一点也不明白(为什么viewmodel不应该实现INotifyPropertyChanged,或者.net中的简单桌面应用程序最终会使用多个线程,除非我专门设计了多个线程)您能提供一个参考吗?请参考以下链接