如何为用作Validation.ErrorTemplate的ControlTemplate添加绑定TemplateParent属性的DataTrigger?
解决Validation.ErrorTemplate中根据ComboBox属性调整Border Margin的问题
你的思路可行,通过DataTrigger监听ComboBox属性来调整ErrorTemplate里customBorder的Margin即可,不过需要修正几处细节:
- 绑定路径拼写错误:
SomeProperrty→SomeProperty - 更可靠的绑定源:直接通过
AdornedElementPlaceholder的AdornedElement获取对应的ComboBox,这个属性就是被验证的目标控件,比用AncestorType查找更稳定 - 确保触发器逻辑能正确触发
以下是修正后的完整ControlTemplate代码:
<ControlTemplate x:Key="val"> <Border Name="bor"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <AdornedElementPlaceholder x:Name="customAdorner" Grid.Column="0" VerticalAlignment="Center" /> <Border Grid.Column="0" x:Name="customBorder" Width="15" Height="15" Margin="0,0,15,0" Background="Red" CornerRadius="8" HorizontalAlignment="Right" ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"> <TextBlock HorizontalAlignment="center" VerticalAlignment="center" FontWeight="Bold" Foreground="white" Text="!" /> </Border> </Grid> </Border> <ControlTemplate.Triggers> <!-- 修正拼写错误,通过AdornedElement直接绑定目标ComboBox的属性 --> <DataTrigger Binding="{Binding ElementName=customAdorner, Path=AdornedElement.SomeProperty}" Value="value"> <Setter Property="Margin" TargetName="customBorder" Value="0,0,20,0"/> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate>
关键说明:
- 依赖
AdornedElementPlaceholder的AdornedElement属性绑定目标ComboBox,避免了VisualTree查找祖先控件的不确定性 - 修正属性名拼写错误后,绑定路径才能正常识别目标属性
- 当ComboBox的
SomeProperty值等于"value"时,DataTrigger会自动将customBorder的Margin修改为0,0,20,0
内容的提问来源于stack exchange,提问作者Павел Закриев
相关产品推荐
相关产品推荐

