WPF错误样式仅在选项卡控件的可见选项卡上正确呈现
我有一个数据对象用于包含支持INotifyPropertyChanged
和IDataErrorInfo
UI数据。 最初我将所有的UI控件显示在一个大的WPF应用程序中,很高兴看到通过这个自定义样式标记的错误:
我今天正在重新组织程序,并决定在TabControl
几个页面上分发各种UI控件。 我正在使用的结构布局是:
[.. various Stack Panels, Groups and UI controls moved from original layout ..] [.. various Stack Panels, Groups and UI controls moved from original layout ..] ...
(我正在使用AdornerDecorator
因为我在之前的程序中遇到过错误样式,在交换标签页时没有重新呈现。我不记得我在哪里看到这个,但它确实帮助了我。)
现在,当我启动程序时,错误样式正确地呈现在程序启动时打开的TabItem
上,但是没有在其他(隐藏) TabItem
上正确呈现。 当我选择(并显示)其中一个TabItem
,会设置错误样式的工具提示,但不会显示错误图标图像。
我还测试了删除自定义样式并恢复为文本框的默认WPF错误样式,我仍然得到类似的行为,即在程序打开时隐藏的TabItem
控件周围没有红框。
因此,似乎我完全遗漏了一些阻止错误样式从正确渲染除了打开选项卡Item之外的东西。 有任何想法吗?
编辑9月3日更改说明以支持更好地理解我所看到的内容
在2014年谈论Déjàvu
这是2014年11月和今天我有这个愚蠢的WPF问题,错误模板没有显示在选项卡控制器中显示的项目。 我心中的一些东西表明我以前见过这个问题。 所以我谷歌,弹出的第一件事是我自2009年以来的问题!
这次我看到dkl的评论,这是在我最后一次解决问题后添加的。 所以我按照他的方式尝试并使用了这个解决方案(效果很好,我不需要在我的选项卡控件上添加一个Adorner控件):
*
(我正在使用AdornerDecorator,因为我在以前的程序中遇到过错误样式,在交换标签页时没有重新呈现。我不记得我在哪里看到这个,但它确实帮助了我)
据推测,这个确实重要的提示源自Karl Shifflets博客 ,至少他正在解决同一主题: 切换TabItem时,TabControl内部的WPFvalidation错误消失 。
鉴于此问题,您的问题可能只是相关的,即上面的提示/代码确保现在每个标签项都有专用的AdornerLayer
,因为切换标签时会丢弃父元素的装饰层。 这个专用的装饰层似乎仍然需要一些特殊的处理,例如,请参阅问题WPF ErrorTemplate在未聚焦时可见? 这基本上是颠倒你的问题。 因此,我建议您使用自己的风格组合并扩展后者的概述解决方案并尝试以下(尽管如此,未经测试的代码):
请参阅我关于您更新单选按钮错误样式的评论,它试图类似地解决您可能的相关问题; 你真的在那里试过我的建议吗?
有关装饰体系结构的更多详细信息,请参阅“ assembly体概述 ”。
Steffen Opel用他的链接解决了我的问题: 切换TabItem时,TabControl内部的WPFvalidation错误消失了。
... ... ...
只是为了添加提供的答案,可以在资源字典中设置一次错误模板。 只需要为所有相关元素类型的所有默认样式复制和粘贴触发器。
例如:
或者,更进一步,通过组合样式避免触发重复:
但我会远离这种方法,因为它会破坏设计师。
在上面的示例中,我使用了MahApps.Metro中名为ValidationErrorTemplate
的模板
此外,不要忘记在TabItem
修复中使用AdornerDecorator
,如@ Abyte0所述,以便在切换选项卡时保持validation。