![](/img/trans.png)
[英]Using DataTrigger on Validation.ErrorTemplate property
[英]How to do DataTrigger Binding inside Validation.ErrorTemplate in WPF
我有一个被ControlTemplate
包围的CustomControl
。 该CustomControl
包含另一个CustomControl
与Label
, TextBox
和Validation.ErrorTemplate
为TextBox
。
我想做的是,当我将CustomControl
悬停或将TextBox
放在焦点上时,将弹出Validation.ErrorTemplate
。
现在并且仅当我将Border
悬停在TextBox
周围时,它才弹出Validation.ErrorTemplate
。 老实说,我不确定它是StackPanel
的Border
还是AdornedElementPlaceholder
的Border
。 我真的不知道如何将绑定DataTrigger
里面Validation.ErrorTemplate
到外Border
IsMouseOver
财产或IsFocused
物业TextBox
。
在我到目前为止的代码下面:
<ControlTemplate TargetType="{x:Type my:CustomControl}" x:Key="CustomTemplate">
<Border BorderBrush="Green" BorderThickness="1" x:Name="outerBorder">
<my:LabelControl Label="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ViewModel.Label}">
<TextBox HorizontalAlignment="Stretch" Padding="3 0 3 0" Foreground="{DynamicResource Control.Foreground}">
<TextBox.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="CornerRadius" Value="3"/>
</Style>
</TextBox.Resources>
<TextBox.Text>
<Binding Path="ViewModel.Value" UpdateSourceTrigger="PropertyChanged" RelativeSource="{RelativeSource TemplatedParent}" ValidatesOnDataErrors="True"/>
</TextBox.Text>
<TextBox.Style>
<Triggers>
...
</Triggers>
</TextBox.Style>
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel x:Name="BorderBorder">
<Border BorderThickness="1" BorderBrush="Red" CornerRadius="3" HorizontalAlignment="Left" >
<AdornedElementPlaceholder x:Name="textBox"/>
</Border>
<Border Background="LightGoldenrodYellow" CornerRadius="3">
<TextBlock Text="{Binding [0].ErrorContent}"/>
<Border.Style>
<Style>
<Setter Property="Border.Visibility" Value="Collapsed"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=BorderBorder, Path=IsMouseOver}" Value="true">
<Setter Property="Border.Visibility" Value="Visible"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
</my:LabelControl>
</Border>
</ControlTemplate>
因此,如果可能的话, Validation.ErrorTemplate
内部的DataTrigger
应该绑定到ElementName=outerBorder
。
我猜问题是我在ControlTemplate
内有一个ControlTemplate
所以内部ControlTemplate
( Validation.ErrorTemplate
)中的DataTrigger
Binding
不了解外部Properties
。
您可以将TextBox
的Tag
属性绑定到控件本身的IsMouseOver
属性,然后将DataTrigger
绑定到装饰元素的Tag
属性:
<ControlTemplate TargetType="{x:Type my:CustomControl}" x:Key="CustomTemplate">
<Border BorderBrush="Green" BorderThickness="1" x:Name="outerBorder">
<my:LabelControl Label="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ViewModel.Label}">
<TextBox HorizontalAlignment="Stretch" Padding="3 0 3 0" Foreground="{DynamicResource Control.Foreground}"
Tag="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=my:CustomControl}}">
<TextBox.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="CornerRadius" Value="3"/>
</Style>
</TextBox.Resources>
<TextBox.Text>
<Binding Path="ViewModel.Value" UpdateSourceTrigger="PropertyChanged" RelativeSource="{RelativeSource TemplatedParent}" ValidatesOnDataErrors="True"/>
</TextBox.Text>
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel x:Name="BorderBorder">
<Border BorderThickness="1" BorderBrush="Red" CornerRadius="3" HorizontalAlignment="Left" >
<AdornedElementPlaceholder x:Name="textBox"/>
</Border>
<Border Background="LightGoldenrodYellow" CornerRadius="3">
<TextBlock Text="{Binding [0].ErrorContent}"/>
<Border.Style>
<Style>
<Setter Property="Border.Visibility" Value="Collapsed"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding AdornedElement.(TextBox.Tag), ElementName=textBox}" Value="True">
<Setter Property="Border.Visibility" Value="Visible"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
</my:LabelControl>
</Border>
</ControlTemplate>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.