我是 MVVM(和一点 WPF)的新手,在过去的几天里,我阅读了许多 Code Project 文章、博客文章和 Stackoverflow 问题。我的印象是,一旦从数据源(数据库)加载数据,数据绑定就可以很好地显示数据,并使模型与视图保持同步,同时更新视图中模型数据的所有其他外观。
但是我仍然不知道如何保存以及在验证之前应该如何正常工作。我有很强的 Windows 窗体和 ADO.NET 背景。我非常熟悉数据库访问层和视图更新的编码。那时,您有临时的临时数据,正在编辑,仅在视图中,以及模型类和数据库中数据的最后保存版本。模型类通常与数据库同步。它是包含尚未保存的数据的视图。
您还有一个保存按钮,它可以从控件中读取所有数据,在代码中对其进行验证,然后接受并将其保存到模型和数据库中,或者不更新模型并改为显示错误消息。如果出现错误,用户输入会保留在 UI 中以供用户更正。但是应用程序的其他部分无法看到它。并且您有一个取消按钮,它只会丢弃包含编辑控件的视图部分 - 模型仍然有效且未更改。
现在,数据绑定和 ViewModels 只是从模型类中公开数据,在 TextBox 中输入的内容会立即进入模型,无论它是否正确。IDataErrorInfo 仅此而已 - 提供信息。你可以看它或忽略它。唯一强制执行的硬验证是类型转换:您永远不能将非数字字符串更新为数字模型字段。但仅此而已。我将通过让 ViewModel 进行所有验证并从属性设置器对无效数据抛出异常来解决这个问题。这是实现已知行为的唯一方法。
但是数据的保存和丢弃到哪里去了?我什么时候才能真正将数据写回数据库?TextBox 的每次离开都会导致数据库写入,因此我不再需要显式的 Save 命令(并且只能通过 Undo 恢复)?我什么时候验证整条数据记录?我将如何处理模型和数据库不同步,由于数据绑定而导致无效输入立即传播到整个应用程序和所有视图?何时以及如何使用取消按钮丢弃任何用户输入,保持模型不变 - 或将其恢复到打开编辑器对话框之前的状态?
我觉得 MVVM 并没有为这些基本问题提供解决方案。我只是想念他们还是他们真的不存在?如果 MVVM 不能解决这个问题,那是什么?或者 MVVM 最好不要用于 WPF 中的数据编辑应用程序?