Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中的Validation.ErrorTemplate内进行DataTrigger绑定_C#_Wpf_Validation - Fatal编程技术网

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: