【问题标题】:WPF ValidationRule Binding to display the error messageWPF ValidationRule Binding 以显示错误消息
【发布时间】:2020-09-02 17:48:57
【问题描述】:

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

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

备注:我尝试在下面 XAML 的以下行 <Setter Property="ToolTip" 中将 ToolTip 替换为 TexBlock,并在 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,0,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>

验证信息截图 [当用户输入非字母字符时]

【问题讨论】:

    标签: wpf xaml data-binding


    【解决方案1】:

    将绑定到ErrorContent 属性的TextBlock 添加到Validation.ErrorTemplate

    <ControlTemplate x:Key="ValidationTemplate">
        <DockPanel>
            <TextBlock Foreground="Red" FontSize="20" DockPanel.Dock="Left">!</TextBlock>
            <TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red" DockPanel.Dock="Bottom"/>
            <AdornedElementPlaceholder/>
        </DockPanel>
    </ControlTemplate>
    

    【讨论】:

    • 工作就像一个魅力。您的这条评论对我很重要,因为它帮助我更好地理解了 WPF 验证:Add a TextBlock that binds to the ErrorContent property to the Validation.ErrorTemplate
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2011-03-12
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多