如何在WPF MVVM中验证和保存数据是否正常?

时间:2012-07-06 13:06:20

标签: c# wpf database mvvm

我是MVVM(以及一些WPF)的新手,我在过去几天阅读了许多Code Project文章,博客文章和Stackoverflow问题。我的印象是数据绑定非常适合在从数据源(数据库)加载后显示数据,并使模型与视图保持同步,还会更新视图中模型数据的所有其他外观。 / p>

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

您还有一个“保存”按钮,该按钮将读取控件中的所有数据,在代码中验证它并接受并将其保存到模型和数据库,或者不更新模型并显示错误消息。如果出现错误,用户输入仍保留在UI中供用户更正。但是应用程序的其他任何部分都无法看到它。你有一个取消按钮,它会丢弃包含编辑控件的视图部分 - 模型仍然有效且不变。

现在使用数据绑定和ViewModel只是公开Model类中的数据,TextBox中输入的内容会立即进入模型,无论是否正确。 IDataErrorInfo只不过是 - 信息性的。你可以考虑它或忽略它。强制执行的唯一硬性验证是类型转换:您永远不能将非数字字符串更新为数字模型字段。但那是关于它的。我将通过让ViewModel进行所有验证并在属性setter上对无效数据抛出异常来解决这个问题。这是实现已知行为的唯一方法。

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

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

3 个答案:

答案 0 :(得分: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和其余部分,还有其他选择。但我发现这种方法很容易理解发生了什么,并且是添加你可能需要的其他东西的好基础。

答案 1 :(得分:1)

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

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

我不是数据库专家,但我会在我的VM中收集信息,并在视图中的某处添加一个保存按钮,用于验证数据并将其写入数据库。取消按钮可以使用模型(数据库)中的(未更改的)值覆盖VM属性。

(编辑:Pete说:)

答案 2 :(得分:0)

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