【问题标题】:Ho to do WPF MVVM Validation outside of ViewModel?如何在 ViewModel 之外进行 WPF MVVM 验证?
【发布时间】:2016-03-17 21:23:07
【问题描述】:

我是 WFP 的新手,我正在做一个 MVVM 项目并试图弄清楚...我阅读了很多关于验证的内容,但没有找到我想要的。 我不想将验证逻辑放在 ViewModel 或 View 中。我想将验证保留在业务逻辑层中,并且只有在那里,这是一个单独的项目,大概可以与任何数据源或 UI 一起使用,因此我不能将 WPF 特定的东西放入其中。 我想使用 FluentValidation 但我不知道如何在我的 ViewModel 中链接它。 假设我有一个包含一个字段的输入表单,Save 按钮正在从业务逻辑请求 Save 方法,如果字段为空并带有相应的消息(“请输入一些内容”),业务逻辑会抛出 ValidationException。 如何将其链接到 View/ViewModel 以将其反映给用户?

感谢任何帮助,如果问题很愚蠢,对不起,这个 WPF 很难:)

编辑,回复约翰·奥多姆:我已经到了在我的 ViewModel 中我有保存命令的地步,它执行类似的操作

           try
            {
                EditedItem= itemService.PersistItem(EditedItem);

            }
            catch (ValidationException ex)
            {

              foreach (var result in ex.Errors)
                {
                    Console.WriteLine("Property name: " + result.PropertyName);
                    Console.WriteLine("Error: " + result.ErrorMessage);
                    Console.WriteLine("");
                }
            }

我想将 CATCH 部分中的信息与我的视图相关联,并向用户显示错误信息

【问题讨论】:

  • 您好,欢迎来到 StackOverflow!您能否向我们展示您到目前为止所做的尝试?
  • 这样做有什么具体原因吗?因为 MVVM 的目的是将这些关注点从业务逻辑中分离出来。
  • 验证对我来说是业务逻辑的一部分。如果我想为同一个系统创建一个 Web UI,我将不得不复制验证。除非我错过了什么……
  • 如果您验证 用户输入,则验证部分是 View 或 ViewModel 的工作。业务逻辑应该验证您自己的错误,例如空值检查。为了可重用性,您可以创建ValidationRule 并在您的视图中使用它们。
  • 我可以在单独的程序集中使用这些 ValidationRules 吗?例如,我不希望我的 WPF UI 视图“知道”有效的年龄范围是 21-130,如该示例所示。如果我有那个,然后有另一个网络界面,我也必须在那里重复 21-130 信息。这种验证逻辑我只想提供一次,并且在 WPF UI 程序集之外。用户输入验证可能是 View/ViewModel 的工作,让他们去做,但是关于什么是有效的,什么是无效的信息我仍然认为是业务逻辑工作

标签: wpf validation mvvm


【解决方案1】:

你可以在 UI 上有一个单独的标签,最初隐藏它。在视图模型中绑定可见和内容。 每当出现异常时,让 Label 可见并在 Viewmodel 中设置其内容。

【讨论】:

  • 这很简单,谢谢!有用。只是我有一个标签显示所有错误。我现在正试图让它类似于“典型的”WPF 验证错误,每个字段一个,但我仍然希望代码是通用的。我想我需要研究索引属性或其他东西,因为从 FluentValidator 我确实得到了一组带有消息和每个字段名的错误
  • 如果您认为已回答,请选择正确答案:)。另外,如果您喜欢解决方案 1,请。
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2016-07-04
  • 2010-12-06
  • 2019-10-17
  • 1970-01-01
相关资源
最近更新 更多