【发布时间】:2015-08-27 20:48:48
【问题描述】:
试图弄清楚如何捕获仅限查看的验证错误,例如在绑定到整数属性的文本框中输入非数字字符。我希望 Catel DataWindow 的行为始终如一。
说明:
我有一个 Catel MVVM 窗口(使用 DataWindow 和具有模型属性的视图模型实现。)
模型属性是一个整数:
public Foo { get { GetValue .......... } }
视图模型属性也是一个整数,并且绑定到模型:
[ViewModelToModel(...)]
public Foo { get { GetValue .......... } }
在视图中,有一个绑定到Foo 的文本框。当用户在文本框中输入非整数值时,绑定过程自然会出错,并且由于文本框将ValidatesOnExceptions设置为true,Catel信息消息栏出现如下:
我必须解决的两个问题:
- 我需要一条自定义错误消息(“无法转换值 117.228”不会在此处显示。)
-
WarningAndErrorValidator确实发现了错误,但DataWindowOK 按钮仍处于启用状态,并且我能够“保存”视图模型。当出现任何错误时,我需要禁用 OK,即使它们没有进入视图模型。
网络搜索提供了几种可能的解决方案:
- Bind to a view model property that's a string, and handle mapping/conversion between the view model and the model
- Build support in the MVVM framework to trap UI validation errors and communicate them to the view model
解决方案 #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 的文档中没有看到任何表明支持该方法的内容。我错过了一个简单的解决方案吗?
更新:我刚刚了解了数字文本框的行为,这可能是解决我的特定问题的另一种方法,但我真的在寻找一种更通用的解决方案来捕获查看模型验证。
【问题讨论】:
标签: wpf validation mvvm data-binding catel