1

我已经在我的 WPF 应用程序中构建了一个用于编辑数据的表单。我正在向表单添加验证。我开始使用这篇文章这篇文章,但错误模板要么一直显示,要么根本不显示。我不知道我做错了什么。

这是我正在使用的ControlTemplateand 。Style它们位于表单的资源中:

<ControlTemplate x:Key="TextBoxErrorTemplate">
    <StackPanel ClipToBounds="False" Orientation="Horizontal">
        <Border BorderBrush="Red"
                BorderThickness="1"
                Margin="15,0,0,0">
            <AdornedElementPlaceholder Name="adornedElement" />
        </Border>
        <Image HorizontalAlignment="Right"
               VerticalAlignment="Top"
               Width="20"
               Height="20"
               Margin="0,-5,-5,0"
               Source="{StaticResource ErrorImage}"
               ToolTip="{Binding Converter={StaticResource ErrorConverter}, 
                                 ElementName=adornedElement, 
                                 Path=AdornedElement.(Validation.Errors)}" />
    </StackPanel>
</ControlTemplate>

<Style x:Key="TextBoxErrorStyle" TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip"
                    Value="Binding Converter={StaticResource ErrorConverter}, 
                                   RelativeSource={x:Static RelativeSource.Self}, 
                                   Path=AdornedElement.(Validation.Errors)}"/>
        </Trigger>
    </Style.Triggers>
</Style>

TextBox是使用这些部分的:

<TextBox Grid.Column="0"
            Margin="5,0"
            MaxLength="50"
            Name="NameBox"
            TabIndex="0"
            Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}"
            Style="{StaticResource TextBoxErrorStyle}"
            TextAlignment="Left"
            TextChanged="NameBox_TextChanged"
            VerticalAlignment="Center"
            Visibility="{Binding Converter={StaticResource InvertedBoolToVisibility}, Path=AutoConfigureCameras, RelativeSource={RelativeSource AncestorType={x:Type cs:EditLPRDetails}}}">
    <TextBox.Text>
        <Binding Mode="TwoWay" Path="Name" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <cs:RegexValidationRule Pattern="{StaticResource NamePattern}" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

请注意,RegexValidationRule类中的验证逻辑有效。当我将有效字符串放入 中时TextBox,它返回成功,当我将无效字符串放入其中时,它返回失败。不管有什么问题,我相信问题出在Style's Trigger.

4

2 回答 2

2

你很接近,Setter Value绑定的语法不正确,另外你应该设置PathValidation.Errors

 <Setter Property="ToolTip"
         Value="{Binding Converter={StaticResource ErrorConverter},
                         RelativeSource={x:Static RelativeSource.Self},
                         Path=(Validation.Errors)}"/>
于 2013-10-19T05:17:50.677 回答
0

我找到了我的问题的答案。

事实证明,我的对话框包含一个TabControl,这就是问题的原因。我在这篇文章中找到了答案。本质上,我需要将TabItem包含正在验证的控件的内容放在控件内部,该AdornerDecorator控件本身就在Border控件内部。完成后,错误指示器将全部正确显示。

起初我没有包括我的控件在 a 内部的事实,TabControl因为我不知道这很重要。活到老,学到老。

于 2013-10-21T21:28:50.610 回答