如何在Catel中捕获仅查看验证错误?

时间:2015-08-27 20:48:48

标签: wpf validation mvvm data-binding catel

试图弄清楚如何捕获仅查看验证错误,例如在绑定到整数属性的文本框中输入非数字字符。我希望Catel DataWindow表现得一致。

说明

我有一个Catel MVVM窗口(使用DataWindow实现,以及一个带有模型属性的视图模型。)

model属性是一个整数:

    public Foo { get { GetValue .......... } }

视图模型属性也是一个整数,并绑定到模型:

    [ViewModelToModel(...)]
    public Foo { get { GetValue .......... } }

在视图中,有一个绑定到Foo的文本框。当用户在文本框中输入非整数值时,绑定过程中自然会出现错误,并且由于文本框的ValidatesOnExceptions设置为true,因此以下内容会显示在Catel信息中消息栏:

Attempting to enter a non-integer in a text box bound to an integer property

我必须解决两个问题:

  • 我需要一条自定义错误消息(“无法转换价值117.228”不会飞到这里。)
  • WarningAndErrorValidator确实收到错误,但DataWindow确定按钮仍处于启用状态,我可以“保存”视图模型。我有可能在有任何错误时被禁用,即使它们没有进入视图模型。

网络搜索提供了几种可能的解决方案:

  1. Bind to a view model property that's a string, and handle mapping/conversion between the view model and the model
  2. Build support in the MVVM framework to trap UI validation errors and communicate them to the view model
  3. 解决方案#1绝对是“解决方法”解决方案,因为这意味着我在视图模型中需要这样的东西(原谅伪代码......):

        [ViewToViewModel(...)]
        public int Foo { ...... }
    
        // Also a Catel property
        public string Foo_Raw { ...... }
    
        // Property changed handlers for both the above properties, keeping them in sync with one another when possible...
    
        protected override void ValidateBusinessRules(List<.......> validationResults)
        {
            if (this.Foo_Raw != this.Foo.ToString())
            {
                validationResults.AddError("Foo must be an integer.");
            }
        }
    

    我对创造这种摇摇欲坠的结构的前景感到不满。

    我宁愿选择#2这样的东西,但我没有在Catel的文档中看到任何暗示该方法得到支持的内容。我想念一个简单的解决方案吗?

    更新:我刚刚了解了数字文本框行为,这可能是解决我的具体问题的另一种方法,但我真的在寻找一种更通用的解决方案来捕获绑定/ UI错误查看模型验证。

2 个答案:

答案 0 :(得分:1)

问题是您尝试接收的异常尚未绑定(因为绑定它们会出错)。虚拟机无法知道此问题。由于这是与视图相关的问题,因此您只能在视图中处理此错误。

一种解决方案可能是将WarningAndErrorValidator捕获的消息转发到视图模型上。您可以在视图上定义自己的WarningAndErrorValidator并订阅Validated事件。然后你可以将它传递给你的虚拟机。如果您希望在应用中的所有控件之间共享,则需要为视图编写自定义基类。

答案 1 :(得分:1)

Geert van Horrik的回答并不完全正确(除非我错过了什么,Geert)。 WarningAndErrorValidator仅捕获视图模型错误,而不是可视树本身的错误或绑定错误。事实证明InfoBarMessageControl没有WarningAndErrorValidator的帮助就是DataWindow

我所做的是,在我的InfoBarMessageControl子类中,我复制了来自DataWindow::ValidateData的逻辑,用于捕获和分析可视树验证错误,并且我维护了一个类似的错误消息数据结构。

然后像我这样覆盖 protected override bool ValidateData() { // In addition to base class logic, make sure there are no errors of any kind including view-only errors (like binding exceptions or ValidationRule errors). return base.ValidateData() && this.ViewErrorCount == 0; }

ViewErrorCount

int是一个简单的print_r($_POST['nb_acces']); ,当我如上所述捕获错误时,我会更新它。