验证错误:数据错误时未显示模板

24

这是一个关于WPF的谁干了什么的问题!我的验证模板没有按预期出现。

问题

基本上,我在我的视图模型中使用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。

我正在将WPF托管在winforms中,如果这有区别的话。 我在我的代码或样式中找不到任何有关Validation或ErrorTemplate的引用,所以我很确定这不是一个样式自己的问题。

1个回答

50

解决了。

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

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

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

修复方法很简单,只需将我的窗口控件模板包装在<AdornerDecorator>中即可。


5
向您致敬!我在一个VS扩展中使用了一个UserControl > Expander > Textbox,但它无法显示IDataErrorInfo错误。我制作了一个简单的WPF应用来托管UC - 问题仍然存在(排除了VS Extn)。我创建了另一个VM - 它可以工作,所以VM已排除。然后我看到了您的帖子 - 在窗口和UC中添加了一些Loaded事件处理程序。果然,UC返回了null AdornerLayer。将expander内容包装在AdornerDecorator中就可以了!这让我浪费了2天时间,我想说活到老学到老吧。再次感谢您的坚持和记录下来给后人参考! - Gishu
2
这刚好解决了我的问题,我遇到了一个没有提供AdornerDecorator的Metro风格窗口。谢谢! - mortware
这解决了相同的问题,同时使用Modern UI的ModernDialog。如果您用AdornerDecorator包装ModernDialog的内容,则问题得以解决。非常感谢。 - Huseyin Yagli
同样的问题,尽管我花了一些时间才找到正确的位置放置AdornerDecorator。与Gishu不同的是,展开器内容上的AdornerDecorator没有起作用。在我的情况下,树形结构类似于Window > Expander > StackPanel > StackPanel > TextBox,AdornerDecorator必须围绕最后一个StackPanel。 - stijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接