WPF ValidationRule绑定以显示错误消息

问题描述

在以下代码中,我使用ValidationRule来验证TextBox上的用户输入。它工作正常。如果用户输入无效的数据(任何非字母字符),它将在文本框的左侧显示一个红色的小!符号,并且如果将鼠标悬停在文本框上,它将显示一条无效的数据消息(如图所示)下面)。

问题:我们如何修改以下代码,以便-instead of tooltip,无效数据消息显示在文本框正下方?

备注:我尝试在下面XAML的以下行<Setter Property="ToolTip"中用TexBlock替换ToolTip,并在文本框TexBox下方放置一个文本块,如下所示:<TextBlock Text="{Binding (Validation.Errors)[0].ErrorContent,ElementName=txtTest}"/>。但是(按预期方式)它没有用,因为TextBlock当然不是TextBox的属性

MyDataSource.cs

public class MyDataSource
{
public MyDataSource()
{

}

public string FirstName { get; set; }
}

AlphabetsOnlyValidationRule

public class AlphabetsOnlyValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value,CultureInfo cultureInfo)
    {
        string sVal = value as string;

        if (string.IsNullOrEmpty(sVal))
        {
            return new ValidationResult(false,"Please enter some text");
        }

        if (!sVal.ToList().All(t => char.IsLetter(t)))
        {
            return new ValidationResult(false,"First Name should contains alphabets only");
        }

        return new ValidationResult(true,null);
    }
}

MainWindow.xaml

<Window.Resources>
    <local:MyDataSource x:Key="Ods"/>
    <local:AlphabetsOnlyValidationRule x:Key="AlphabetsOnlyKey"/>
    
    <ControlTemplate x:Key="ValidationTemplate">
        <DockPanel>
            <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
            <AdornedElementPlaceholder/>
        </DockPanel>
    </ControlTemplate>

    <Style x:Key="TextBoxInError" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"  Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <TextBox x:Name="txtTest" Margin="48,572,388" Style="{StaticResource TextBoxInError}" Validation.ErrorTemplate="{StaticResource ValidationTemplate}">
        <TextBox.Text>
            <Binding Path="FirstName" Source="{StaticResource Ods}" UpdateSourceTrigger="PropertyChanged" >
                <Binding.ValidationRules>
                    <local:AlphabetsOnlyValidationRule />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
</Grid>

验证消息的屏幕截图 [当用户输入非字母字符时]

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)