繁体   English   中英

如何在WPF中的Validation.ErrorTemplate中进行DataTrigger绑定

[英]How to do DataTrigger Binding inside Validation.ErrorTemplate in WPF

我有一个被ControlTemplate包围的CustomControl CustomControl包含另一个CustomControlLabelTextBoxValidation.ErrorTemplateTextBox

我想做的是,当我将CustomControl悬停或将TextBox放在焦点上时,将弹出Validation.ErrorTemplate

现在并且仅当我将Border悬停在TextBox周围时,它才弹出Validation.ErrorTemplate 老实说,我不确定它是StackPanelBorder还是AdornedElementPlaceholderBorder 我真的不知道如何将绑定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所以内部ControlTemplateValidation.ErrorTemplate )中的DataTrigger Binding不了解外部Properties

您可以将TextBoxTag属性绑定到控件本身的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM