验证ErrorTemplate未显示数据错误

Noe*_*edy 20 wpf xaml adornerlayer

这有点像WPF whodunnit!我的验证寺庙在预期时没有出现

问题

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

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

继承我的xaml绑定代码:

<TextBox x:Name="txtCaseNumber"  
Text="{Binding Path=CaseNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Noe*_*edy 44

破了.

ErrorTemplate附加属性使用adorner层显示通过IDataErrorInfo报告的数据验证失败的错误模板.在所有情况下,Adorner图层并非始终可用于所有控件.您的控件或其父母之一需要明确提供一个.

默认的Window控件模板包含一个AdornerDecorator,可为其子项启用adorner图层.这就是为什么我的其他窗口显示我的错误模板就好了,因为这个窗口使用了默认的控件模板

没有显示我的错误模板的窗口使用了为我的窗口提供ControlTemplate的样式.此控件模板未提供<AdornerDecorator>,因此没有显示我的错误模板的装饰层.

修复就像包装我的窗口控件模板一样简单<AdornerDecorator>.

  • 先生,我向你倾诉我!我在VS扩展中有一个UserControl> Expander> Textbox.但它不会显示IDataErrorInfo错误.制作了一个示例WPF应用程序来托管UC - 问题持续存在(VS Extn排除).制造了另一个虚拟机 - 它有效地排除了虚拟机.然后我点击你的帖子 - 在窗口和UC中添加了几个Loaded事件处理程序.果然,UC返回了一个null AdornerLayer.使用AdornerDecorator包装扩展器内容,它工作正常!让我放慢了2天..活着我学习了.再一次,感谢持久性和时间为后代记录它! (5认同)
  • 这只是通过不提供 AdornerDecorator 的 Metro 风格窗口解决了我的问题。谢谢! (2认同)