试图弄清楚如何捕获仅查看验证错误,例如在绑定到整数属性的文本框中输入非数字字符。我希望Catel DataWindow
表现得一致。
说明
我有一个Catel MVVM窗口(使用DataWindow
实现,以及一个带有模型属性的视图模型。)
model属性是一个整数:
public Foo { get { GetValue .......... } }
视图模型属性也是一个整数,并绑定到模型:
[ViewModelToModel(...)]
public Foo { get { GetValue .......... } }
在视图中,有一个绑定到Foo
的文本框。当用户在文本框中输入非整数值时,绑定过程中自然会出现错误,并且由于文本框的ValidatesOnExceptions
设置为true
,因此以下内容会显示在Catel信息中消息栏:
我必须解决两个问题:
WarningAndErrorValidator
确实收到错误,但DataWindow
确定按钮仍处于启用状态,我可以“保存”视图模型。我有可能在有任何错误时被禁用,即使它们没有进入视图模型。 网络搜索提供了几种可能的解决方案:
解决方案#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错误查看模型验证。
答案 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']);
,当我如上所述捕获错误时,我会更新它。