2012-07-06 45 views
4

我是MVVM(和一些WPF)的新手,在过去的几天里我已经阅读了许多代码项目文章,博文和Stackoverflow问题。我有这样的印象:数据绑定对从数据源(数据库)加载数据后显示数据非常好,并且保持模型与视图同步,并更新视图中模型数据的所有其他外观。验证和保存WPF MVVM中的数据如何正常工作?

但我仍然没有真正知道如何节省,而验证之前,应该工作的权利。我有一个强大的Windows窗体和ADO.NET背景。我非常熟悉编码数据库访问层和视图更新。那时候,您只有临时的临时数据,正在编辑,只有在视图中,以及模型类和数据库中最后保存的数据版本。模型类通常与数据库同步。这是包含尚未保存的数据的观点。

你也有一个保存按钮,将来自控制读取的所有数据,在代码验证它,要么接受,并将其保存到模型和数据库,或者不更新模型,并显示一条错误消息。如果发生错误,用户输入仍留在用户界面中供用户修改。但是没有其他应用程序可以看到它。而且你有一个取消按钮,它只会丢弃包含编辑控件的视图的那一部分 - 该模型仍然有效并保持不变。

使用数据绑定和的ViewModels刚刚从模型类,什么是在文本框中输入暴露数据

现在立即进入模型,是它正确与否。 IDataErrorInfo只不过是 - 信息性的。您可以将其视为或忽略它。唯一实施的严格验证是类型转换:永远不能将非数字字符串更新为数字模型字段。但就是这样。我将通过让ViewModel执行所有验证并从属性设置器中抛出对无效数据的异常来解决这个问题。这是实现已知行为的唯一方法。

但哪里保存和数据的丢弃去?我什么时候会将数据写回数据库? TextBox的每个离开都会导致数据库写入,因此我不再需要显式的Save命令(并且只能通过撤消来恢复)?我何时会验证整个数据记录?我将如何处理模型和数据库不同步,无效输入立即传播整个应用程序和所有视图感谢数据绑定?何时以及如何使用“取消”按钮放弃任何用户输入,保持模型不变 - 或者在编辑器对话框打开之前将其恢复到状态?

我觉得MVVM不提供这些基本问题的解决方案。我只是想念他们还是他们真的不存在?如果MVVM不是这个的解决方案,那么是什么?或者MVVM最好不要用于WPF中的数据编辑应用程序?

+1

尝试交叉张贴到http://programmers.stackexchange.com/您的问题(关于软件开发概念性问题) – Surfbutler 2012-07-06 13:17:54

回答

4

MVVM不回答这些问题,你 - 你有灵活性,在任何你选择的方式来解决数据库写(功率负担?)。如果您需要在保存回数据库之前收集所有数据,则可以这样做 - 只需在ViewModel上添加一个绑定到SaveCommand的Save按钮,该按钮将执行您的数据访问存储过程/实体框架更新方法/无论如何。如果你想单独记录每一位数据,那么你需要在其他地方调用数据访问过程(可能是视图模型上的属性设置器?)

本质上,MVVM不是一个完整的端对端数据库,终端软件模式。它只查看用户看到的内容(列表框,文本框和按钮)与应用程序本身之间的通信。您的数据访问代码,序列化,存储,持久性,无论您使用的是什么,无论您使用的是什么,都将在应用程序代码(模型)中保留在应用程序的MVVM端。不管你喜欢,你都可以写这个。

我正在写一个应用程序,用户填写表单并点击保存或取消。保存和取消都是绑定到ViewModel上的命令的按钮。在ViewModel构造函数中,模型对象的属性被复制到ViewModel的属性中。在保存时,ViewModel的属性被复制回模型的属性,并启动数据访问代码。在取消时,模型的属性被复制到ViewModel的属性上。

class MyViewModel 
{ 
    public MyViewModel(MyModel model) 
    { 
     this.Name = model.Name; 
     this.Colour = model.Colour; 
    } 

    public string Name {get;set;} 
    public string Colour {get;set;} 

    // commands here that connect to the following methods 

    public void Save() 
    { 
     model.Name = this.Name; 
     model.Colour = this.Colour; 
     model.SaveToDatabase(); 
    } 

    public void Cancel() 
    { 
     this.Name = model.Name; 
     this.Colour = model.Colour; 
    } 

} 

这是一个简单的方法来做到这一点 - 当然,你需要在INotifyPropertyChanged引发和它的其余部分,还有其他的选择。但我觉得这种方法很容易理解正在发生的事情,并且有很好的基础来添加其他任何可能需要查找的内容。

+0

谢谢皮特。所以你说(在这些情况下)ViewModel包含Model的数据的_copy_,并且不仅仅传递所有get和set请求到模型实例?因为这是我在例子和教程中经常看到的,我认为这将是最好的方式。也许我只是没有对自己想要复制数据的模式做一点修改。 – ygoe 2012-07-06 14:01:27

+0

也许是因为他们说验证应该进入模型。并且为了验证在编辑过程中产生效果,数据需要直接导入到模型中...因此,以您的示例为例,我认为验证将完全进入ViewModel,对吧? – ygoe 2012-07-06 14:07:17

+0

是的 - 你可以使用'DataAnnotations'属性更快地进行验证,或者进行自定义验证。如果你也想在模型上使用验证/而不是,你需要稍微修改这个东西 - 也许把VM属性挂钩到模型的一个单独的,断开的实例(使用'Clone()'或者其他方法? )并且用'Save()'同步这两者。我仍然在玩弄自己并且探索自己的答案,但是我远离框架来理解问题和不同的方式。玩得开心! – 2012-07-06 14:21:06

0

我认为您将ViewModel与数据库混淆,您的视图绑定到ViewModel在离开TextBox时,TextBox中的任何内容都将被分配给ViewModel的对象,该对象仍在内存中。您将需要一个保存按钮,MVVM仅仅是一个模式,用于分离传统视图和代码,以便进行解耦和简单的单元测试。保存按钮被点击后,您仍然需要执行数据验证。为了放弃用户输入并恢复到之前的状态,您可以在编辑之前保存您的ViewModel数据,或者使用Entity Framework来跟踪和管理数据更改。

1

使用MVVM,可以将视图中的控件绑定到ViewModel中的属性和命令。该模型代表您的数据库。

验证用户输入可以通过多种方式完成。你可以限制文本框只接受某些数据,你可以验证属性设置等数据等

我不是数据库专家,但我会收集我的虚拟机中的信息,并添加一个保存按钮的视图中的某个地方验证数据并将其写入数据库。取消按钮可以用来自模型(数据库)的(不变的)值覆盖VM属性。

(编辑:什么皮特说:)