我环顾四周,但无法专门找到我的问题。我知道WPF中的默认“错误”处理会在控件周围放置一个“Adorner”,以防有任何基于IDataErrorInfo或Validataion规则失败给定控件的错误。然而,这一切都很好,有了标签式页面界面,如果任何控件被标记为无效,则它们被正确地装饰在红色边框中。但是,只要从第1页到第2页再返回到1,所有装饰者都会消失(不好)。这已被问及解决方案已被接受,但正在寻找更好的替代方案。
所以,我去了我的“主题”声明,对于文本框控件,我只是说将控件的整个背景颜色设置为红色而不仅仅是边框。没有任何花哨的强制触发通过Notify on Property Changed,如果我在页面之间交换,整个文本框的红色背景保持不变。
现在,进入组合框控制。对于那些已经自定义的人,甚至是默认的MS版本的控件,它实际上是一组乱七八糟的控件,网格,列,按钮等,以使组合框的魔力发挥作用。简而言之......
的ControlTemplate 网格(两列,一列用于选定的文本显示,第二列用于下拉箭头) 跨越两列的边界 路径(组合框的下拉图像的线条图/字形)
ControlTemplate TargetType文本框(作为整个组合框集的一部分) 边框专门为“PART_ContentHost”
组合框的ControlTemplate 格 切换按钮 下拉列表显示列表 其他触发器..
最后,主要的ComboBox声明由上面的组件模板化。
无论如何,我不能为我的生活得到这个。在组合框声明的“切换按钮”区域中,我有一个触发器可以将背景更改为OBVIOUS关闭颜色,以证明测试触发器的工作情况以及ControlTemplate声明中的正确位置。
因此,知道这是组合框声明中的正确位置,如果数据出错,我想用红色取代绿色背景颜色。我知道整个“Validation.HasError”正确地被触发,因为本机错误处理程序显示。无论模板中的方式/位置如何,我都尝试将背景颜色更改为红色,但它不起作用。我甚至尝试过使用转换器进行DataTriggers,尝试多个属性,但似乎没有合作。
有什么建议吗?这真的很烦人。
答案 0 :(得分:2)
最后,得到了......并没有我想象的那么明显。无论如何,这是我发现的。如果您使用Microsoft的组合框模板中的样本,他们首先提供整体的两列“ToggleButton”声明
<ControlTemplate TargetType="ToggleButton"
x:Key="baseComboBoxToggleButton" >
... blah blah...
</ControlTemplate>
然后,组合框的“显示值”的声明
<ControlTemplate TargetType="TextBox" x:Key="ComboBoxTextBox" >
<Border x:Name="PART_ContentHost" Focusable="False"
Background="{TemplateBinding Background}" />
</ControlTemplate>
然后,将它们绑定在一起作为一个Combobox“包装”声明
<ControlTemplate TargetType="ComboBox" x:Key="ComboBoxGridControlTemplate" >
<Grid x:Name="GridComboWrapper">
<!-- This is the dropdown button that POINTS TO THE "baseComboBoxToggleButton at the top -->
<ToggleButton Name="ToggleButton"
Template="{StaticResource baseComboBoxToggleButton}"
Grid.Column="2" Focusable="false"
IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay,
RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press" >
</ToggleButton>
...
rest of the content presenter,
EDIT(able) textbox area,
popup area of combobox when in drop-down mode
</Grid>
<ControlTemplate.Triggers>
<!-- PUT THE VALIDATION CHECK HERE -->
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
<!-- THIS IS THE CRITICAL COMPONENT... I HAD TO EXPLICITLY TELL
The TagetName as the "ToggleButton" and change ITs Background property
and it now works -->
<Setter TargetName="ToggleButton" Property="Background"
Value="{StaticResource BrushDataInvalidBorder}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
所以,现在它按预期工作,并且不会因为给定表单上的活动页面更改并清除它而松散任何装饰...它对每个单独控件的静态按预期...哇...什么是PITA这一个是。
希望在学习这种嵌套级别的东西时,它可以帮助某个ELSE在未来过度敲击墙壁。