在我的应用程序中,我有绑定到 TextBoxes 的数字(双精度或整数)ViewModel 属性。ViewModel 实现 IDataErrorInfo 以检查输入的值是否在“业务逻辑”的可接受范围内(例如,高度不能是负值)。我每页有多个文本框,并且有一个按钮(在向导中考虑“下一步”),该按钮已启用属性绑定到 ViewModel 布尔值,该布尔值指定整个页面上是否有任何错误。根据我编写的 IDataErrorInfo 规则,按钮的启用/禁用状态已正确更新为有效/无效值。
但是,由于输入值未转换(即“12bd39”不是有效的双精度),因此无法让我的视图模型知道何时引发异常,因此在转换异常的情况下我的“下一步”按钮尽管输入错误,仍将保持启用状态。然而,由于我的绑定,GUI 正确地反映了装饰器的错误:
<TextBox Text="{Binding Temperature, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/>
如何让视图知道发生了“ValidatesOnExceptions”样式错误。Josh Smith 的做法似乎依赖于将每个 ViewModel 属性设为字符串并滚动您自己的异常检查,这似乎需要做很多额外的工作。我还开始研究 Karl Shifflett 的实现here,但在将此代码放入视图的代码隐藏文件时,我似乎无法捕获我期望的路由事件:
public ViewClass()
{
this.InitializeComponent();
this.AddHandler(System.Windows.Controls.Validation.ErrorEvent, new RoutedEventHandler(ValidationErrorHandler));
}
private void ValidationErrorHandler(object sender, RoutedEventArgs e)
{
var blah = e as System.Windows.Controls.ValidationErrorEventArgs;
if (blah.Action == ValidationErrorEventAction.Added)
{
}
else if (blah.Action == ValidationErrorEventAction.Removed)
{
}
}
Silverlight 似乎也有一个您可以订阅的事件,但我在 WPF (3.5) 中找不到确切的等价物。任何帮助表示赞赏!