c# - 在 WPF MVVM 中验证和保存数据如何正常工作?

标签 c# wpf database mvvm

我是 MVVM(和一点 WPF)的新手,最近几天我阅读了许多代码项目文章、博客文章和 Stackoverflow 问题。我的印象是数据绑定(bind)非常适合显示从数据源(数据库)加载的数据并保持模型与 View 同步,同时更新 View 中模型数据的所有其他外观。

但我仍然不知道保存以及验证之前应该如何正常工作。我有很强的 Windows 窗体和 ADO.NET 背景。我非常熟悉数据库访问层和 View 更新的编码。那时候,你有临时的、临时的数据,正在编辑,只在 View 中,以及模型类和数据库中数据的最后保存版本。模型类通常与数据库同步。这是包含尚未保存的数据的 View 。

您还有一个保存按钮,可以从控件中读取所有数据,在代码中对其进行验证,然后接受并将其保存到模型和数据库中,或者不更新模型并显示一条错误消息。如果出现错误,用户输入将保留在 UI 中以供用户更正。但是应用程序的其他部分看不到它。你有一个取消按钮,它只会丢弃包含编辑控件的 View 部分 - 模型仍然有效且未更改。

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

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

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

最佳答案

MVVM 不会为您解决这些问题 - 您可以灵活地(能力?负担?)以您选择的任何方式解决数据库写入问题。如果您需要在保存回数据库之前收集所有数据,您可以这样做 - 只需添加一个绑定(bind)到 ViewModel 上的 SaveCommand 的保存按钮,它会执行您的数据访问存储过程/ Entity Framework 更新方法/等等。如果你想单独记录每一位数据,那么你需要在其他地方调用数据访问过程(可能是 View 模型上的属性 setter ?)

从本质上讲,MVVM 并不是一个完整的端到端软件模式。它只关注用户看到的内容(列表框、文本框和按钮)与应用程序本身之间的通信。您的数据访问代码、序列化、存储、持久性,无论您使用什么以及您如何使用它,都保存在应用程序的 MVVM 端后面,在您的应用程序代码(模型)中。你可以随心所欲地写这个。

我目前正在编写一个应用程序,用户可以在其中填写表单并点击“保存”或“取消”。保存和取消都是绑定(bind)到 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 和其余部分,还有其他选项。但我发现这种方法很容易理解正在发生的事情,并且是添加您可能需要加入的任何其他内容的良好基础。

关于c# - 在 WPF MVVM 中验证和保存数据如何正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11362786/

相关文章:

java - 应用程序安装时用户指定的应用程序路径

android - 从android数据库中删除一行

sql - HSQL 2.2.4,错误的查询计划

c# - httpClient 告诉我错误 c# winform

c# - 将构建操作”更改为“C# 中的嵌入式资源

c# - BinaryFormatter 忽略程序集版本

c# - 如何强制自定义 FrameworkElement 呈现更改的内容?

wpf - 在 WPF 形状中添加一些文本

c# - SignalR 安全

c# - 当用户移动窗口时 PushFrame 锁定 WPF 窗口