0

我已将验证规则绑定到我的 WPF 文本框,以控制用户输入的内容。

WPF 文本框

    <TextBox Grid.Column="0"
             Grid.Row="1" 
             IsEnabled="{Binding Path=IsEnabled}"                                 
             Margin="5,8,8,5">
        <TextBox.Text>
            <Binding Path="ReferenceId"
                     UpdateSourceTrigger="PropertyChanged"
                     ValidatesOnDataErrors="True">
                <Binding.ValidationRules>
                    <vRules:RefValidationRule ValidatesOnTargetUpdated="True" />
                </Binding.ValidationRules>
            </Binding>                         
        </TextBox.Text>            
    </TextBox>

它工作正常。当用户输入错误时,TextBox 边框会变为红色,警告用户输入不正确。

此外,现在我也尝试在 TextBox 下显示验证错误消息,因此我绑定到静态资源下面的 TextBox:

<ResourceDictionary>
            <Style x:Key="ValidationTextBoxErrorStyle" TargetType="{x:Type TextBox}"> 
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Path=IsEnabled}" Value="True" />
                            <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.HasError)}" Value="True" />
                        </MultiDataTrigger.Conditions>
                    
                        <Setter Property="BorderBrush" Value="Red"/>
                        <Setter Property="Validation.ErrorTemplate">
                            <Setter.Value>
                                <ControlTemplate>                                    
                                    <StackPanel>                                        
                                        <AdornedElementPlaceholder x:Name="placeholder" />
                                        <TextBlock FontSize="11" FontStyle="Italic" Foreground="Red" Text="{Binding [0].ErrorContent}" />
                                    </StackPanel>                                    
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
</ResourceDictionary>

文本框现在如下所示:

    <TextBox Grid.Column="0"
             Grid.Row="1"
             Style="{StaticResource ValidationTextBoxErrorStyle}"
             IsEnabled="{Binding Path=IsEnabled}"                                 
             Margin="5,8,8,5">
        <TextBox.Text>
            <Binding Path="ReferenceId"
                     UpdateSourceTrigger="PropertyChanged"
                     ValidatesOnDataErrors="True">
                <Binding.ValidationRules>
                    <vRules:RefValidationRule ValidatesOnTargetUpdated="True" />
                </Binding.ValidationRules>
            </Binding>                         
        </TextBox.Text>            
    </TextBox>

现在运行它时,如果用户在 TextBox 中输入了错误的引用 ID,格式无效,验证错误消息会正确显示在 TextBox 下,但现在 TextBox 边框没有变红。

所以我想要这两件事,我的意思是,当 TextBox 的值无效时,我希望 TextBox 边框获得 RED,同时在其下显示验证错误消息。

那么,我做错了什么?

请注意,我希望 TextBox 获得 RED 并在其下显示验证错误消息,当且仅当存在验证错误并且 IsEnabled 属性为 true 时,我使用了 MultiDataTrigger 的条件不止一个。

4

1 回答 1

0

只需添加Border一个ControlTemplate

<Style x:Key="ValidationTextBoxErrorStyle" TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=IsEnabled}" Value="True" />
                <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.HasError)}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="Validation.ErrorTemplate">
                <Setter.Value>
                    <ControlTemplate>
                        <StackPanel>
                            <Border BorderBrush="Red" BorderThickness="1">
                                <AdornedElementPlaceholder x:Name="placeholder" />
                            </Border>
                            <TextBlock FontSize="11" FontStyle="Italic" Foreground="Red" Text="{Binding [0].ErrorContent}" />
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>
于 2022-02-21T09:04:42.073 回答