C# 如何在WPF中的Validation.ErrorTemplate内进行DataTrigger绑定
我有一个C# 如何在WPF中的Validation.ErrorTemplate内进行DataTrigger绑定,c#,wpf,validation,C#,Wpf,Validation,我有一个CustomControl,周围有一个ControlTemplate。CustomControl包含另一个CustomControl,带有标签、文本框和验证。用于文本框的错误模板 我想做的是,当我悬停CustomControl或聚焦TextBox时,就会弹出Validation.ErrorTemplate 现在它只会弹出Validation.ErrorTemplate当且仅当我将边框悬停在文本框周围时。老实说,我不确定它是堆栈面板中的边框还是装饰元素占位符中的边框。我真的不知道如何将验证
CustomControl
,周围有一个ControlTemplate
。CustomControl
包含另一个CustomControl
,带有标签
、文本框
和验证。用于文本框
的错误模板
我想做的是,当我悬停CustomControl
或聚焦TextBox
时,就会弹出Validation.ErrorTemplate
现在它只会弹出Validation.ErrorTemplate
当且仅当我将边框
悬停在文本框周围时。老实说,我不确定它是堆栈面板中的边框还是装饰元素占位符中的边框。我真的不知道如何将验证中的数据触发器
绑定到外部边框
IsMouseOver
属性或文本框
中的IsFocused
属性
以下是我目前掌握的代码:
<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
我想问题是我在控制模板
中有一个控制模板
,所以数据触发器
绑定
在控制模板
中(验证.ErrorTemplate
)对外部的属性
一无所知。您可以将文本框的标记
属性绑定到控件本身的IsMouseOver
属性,然后将数据触发器
绑定到装饰元素的标记
属性:
<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>
woow谢谢,工作很有魅力。。。你能解释一下装饰元素(TextBox.Tag)
吗?当我需要文本框的DataTrigger
时。我可以只设置两个Tag
属性吗?这看起来像什么?虽然只有一个Tag属性,但您可以绑定到TextBox的任何属性,例如AdorneElement.(TextBox.IsFocused)
您有什么建议如何在DatePickerTextBox IsFocused上实现相同的行为吗?按照您建议的方式尝试,但我不知道如何获取DatePickerTextBox的焦点状态如果您有其他问题,请提出新问题。还请记住包括MCVE: