如何在WPF MVVM验证和保存数据的工作吧?(How does validating and sa

2019-07-30 07:12发布

我是新来的MVVM(和一点WPF)和我在过去的几天里看了很多代码项目的文章,博客文章和#1的问题。 我的印象中,数据绑定的工作方式非常好的显示一次从一个数据源(数据库)加载数据,并与视图保持模型同步,同时更新模型数据的所有其他出现在视图(S)。

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

你也有一个保存按钮,将来自控制读取的所有数据,在代码验证它,要么接受,并将其保存到模型和数据库,或者不更新模型,并显示一条错误消息。 在发生错误的情况下,用户输入保持在UI的用户对其进行校正。 但是,应用程序的任何其他部分可以看到它。 和你有一个取消按钮,将刚刚扔掉包含编辑控件的视图的一部分 - 该模型仍然有效,并保持不变。

现在,随着数据绑定的ViewModels刚刚从模型类暴露的数据,什么是在文本框中输入立即进入模型,是它正确与否。 IDataErrorInfo的无非是更多的 - 信息。 你可以把它或忽略它。 被强制执行的唯一硬验证类型转换:你永远不能更新一个非数字字符串转换成数字模型字段。 但仅此而已。 我会通过让视图模型做验证,并抛出从无效数据的属性setter一个例外解决。 这是贯彻落实公知行为的唯一途径。

但是,在没有存储和数据的丢弃去? 我什么时候会真正将数据写回数据库? 难道一个TextBox的每一个离开导致数据库写入,这样我就不会需要一个明确的保存命令了(只有打通撤消恢复)? 我什么时候能校验数据全程记录? 我将如何处理模型和数据库不同步的,无效的输入立即通过整个应用程序,并感谢所有数据绑定的观点传播? 当我怎么能放弃一个取消按钮,任何用户输入,离开模式不变 - 或将其恢复到一个状态下打开的编辑对话框之前?

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

Answer 1:

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

从本质上讲,MVVM是不是一个完整的端至端软件模式。 它仅着眼于用户所看到的(列表框,文本框和按钮)和应用程序本身之间的通信。 你的数据访问代码,序列化,存储,持久性,无论你正在使用,并且按照自己正在使用它持有的全部应用程序的MVVM侧后面,在应用程序代码(模型)。 只要你喜欢,你可以这样写。

我目前正在写在用户填写表单和点击保存或取消申请。 保存并取消是必然的视图模型的命令两个按钮。 在视图模型的构造中,模型对象的属性被复制到视图模型的属性。 在保存,视图模型的属性被复制回模型的属性和数据访问代码开始。 在取消,模型的属性将被复制回在视图模型的属性。

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和它的其余部分,还有其他的选择。 但我觉得这种方法很容易理解正在发生的事情和良好的基础,添加其他任何你可能需要扔掉英寸



Answer 2:

随着MVVM,你绑定在你看来在你的ViewModel属性和命令控制。 模型代表你的数据库。

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

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

(编辑:皮特说什么:)



Answer 3:

我认为你与数据库混淆视图模型,您的观点是绑定到视图模型对象,留下一个文本框,无论在文本框将被分配到视图模型的对象,这是时,内存。 您将需要保存按钮,MVVM只是分开传统的观点和代码背后去耦和方便的单元测试的模式。 您仍然需要点击后保存按钮来执行数据验证。 对于丢弃用户输入并恢复到以前的状态,你既可以编辑之前保存您的视图模型的数据,或者使用实体框架来跟踪和管理数据的变化。



文章来源: How does validating and saving data in WPF MVVM work right?