23

这是一个有点 WPF whodunnit !我的验证认为它没有按预期出现

问题

基本上,我在我的视图模型上使用 IDataErrorInfo 来提供有关数据输入错误的反馈。我可以看到它被调用并按预期工作,但是 WPF 永远不会显示绑定控件的验证错误模板!

我已经尝试过使用内置的默认文本框红色边框错误模板、样式错误模板和硬编码模板。在数据错误情况下,这些都不会显示。

这是我的 xaml 绑定代码:

<TextBox x:Name="txtCaseNumber"  
Text="{Binding Path=CaseNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>

奇怪的是,错误进入了 Validation.Errors 集合。以下代码导致我的 IDataErrorInfo 错误消息显示在绑定控件旁边。这让我认为问题出在 xaml 方面,而不是 viewmodel 方面。

<ContentPresenter 
Content="{Binding ElementName=txtCaseNumber, Path=(Validation.Errors).CurrentItem}" />

此外, System.Windows.Controls.Validation.GetHasError(txtCaseNumber)返回 true。

如果这有所作为,我将在 winforms 中托管 WPF。我在我的代码或样式中找不到对 Validation 或 ErrorTemplate 的任何引用,所以我很确定这不是样式化自己的目标。

4

1 回答 1

48

破解它。

ErrorTemplate附加属性使用装饰层来显示有关通过 IDataErrorInfo 报告的数据验证失败的错误模板。Adorner 层并不总是适用于所有情况下的所有控件。您的控件或其父母之一需要明确提供一个。

默认的 Window 控件模板包含一个 AdornerDecorator,它为其子级启用装饰层。这就是为什么我的另一个窗口可以很好地显示我的错误模板的原因,因为这个窗口使用了默认的控制模板

没有显示我的错误模板的窗口使用了一种为我的窗口提供 ControlTemplate 的样式。这个控制模板没有提供一个<AdornerDecorator>,因此没有装饰层来显示我的错误模板。

修复就像用<AdornerDecorator>.

于 2010-09-10T14:43:54.347 回答