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

Wpf 如何捕获Catel中的仅查看验证错误?,wpf,validation,mvvm,data-binding,catel,Wpf,Validation,Mvvm,Data Binding,Catel,试图找出如何捕获仅查看验证错误,例如在绑定到整数属性的文本框中输入非数字字符。我希望CatelDataWindow表现一致 说明: 我有一个catelmvvm窗口(使用DataWindow实现)和一个带有model属性的视图模型 模型属性是一个整数: public Foo { get { GetValue .......... } } 视图模型属性也是一个整数,并绑定到模型: [ViewModelToModel(...)] public Foo { get { GetV

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

说明:

我有一个catelmvvm窗口(使用
DataWindow
实现)和一个带有model属性的视图模型

模型属性是一个整数:

    public Foo { get { GetValue .......... } }
视图模型属性也是一个整数,并绑定到模型:

    [ViewModelToModel(...)]
    public Foo { get { GetValue .......... } }
在视图中,有一个绑定到
Foo
的文本框。当用户在文本框中输入非整数值时,绑定过程中自然会出现错误,并且由于文本框的
ValidatesOnExceptions
设置为
true
,Catel信息栏中会出现以下内容:

我必须解决两个问题:

  • 我需要一条自定义错误消息(“值117.228无法转换”将不会在此处显示。)
  • 警告AndErrorValidator
    确实拾取了错误,但是
    数据窗口
    确定按钮仍然处于启用状态,并且我能够“保存”视图模型。当出现任何错误时,我需要禁用“确定”,即使它们没有进入视图模型
网络搜索提供了两种可能的解决方案:

  • 解决方案#1绝对是“变通”解决方案,因为这意味着我在视图模型中需要类似的东西(请原谅伪代码…:

    [ViewToViewModel(…)]
    公共int Foo{……}
    //也是卡特尔的财产
    公共字符串Foo_Raw{……}
    //属性更改了上述两个属性的处理程序,尽可能使它们彼此保持同步。。。
    受保护的覆盖无效ValidateBusiness规则(列出validationResults)
    {
    if(this.Foo_Raw!=this.Foo.ToString())
    {
    AddError(“Foo必须是整数”);
    }
    }
    
    我对创造这种摇摇欲坠的结构的前景感到不高兴

    我更愿意使用类似于#2的东西,但我在Catel的文档中没有看到任何东西表明支持这种方法。我错过了一个简单的解决方案吗


    更新:我刚刚了解了数字文本框行为,这可能是解决我的特定问题的另一种方法,但我确实在寻找一种更通用的解决方案,用于捕获视图模型验证中的绑定/UI错误

    问题是您试图接收的异常尚未绑定(因为绑定它们会出错)。vm无法意识到这个问题。由于这是一个与视图相关的问题,因此只能在视图中处理此错误


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

    Geert van Horrik的回答不太正确(除非我遗漏了什么,Geert)。
    警告AndErrorValidator
    仅捕获视图模型错误,而不是来自可视树本身的错误或绑定错误。事实证明,这是
    InfoBarMessageControl
    在没有
    警告AndErrorValidator
    帮助的情况下所做的事情

    我所做的是,在我的
    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;
        }
    

    viewrorcount
    是一个简单的
    int
    ,当我捕获上述错误时会更新它

    你是说我可以在假设的基类(DataWindow的子类)中添加第二个
    警告AndErrorValidator
    ,或者只为现有的
    验证事件添加一个新的处理程序?没关系,我想我理解为什么要声明第二个验证程序控件。因为不能保证
    数据窗口
    会创建第一个。您可能是正确的。我们已经有一段时间(几年)没有编写WarningAndErrorValidator了。但是,如果WarningAndErrorValidator也可以捕获视图验证,那将是一个很好的补充(因此,我们可以单独访问视图验证)。
        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;
        }