【愚公系列】2023年10月 WPF控件专题 Validation控件详解

举报
愚公搬代码 发表于 2023/10/30 09:08:56 2023/10/30
【摘要】 🏆 作者简介,愚公搬代码🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物...

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。

原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见的标准用户界面元素。

自定义控件则允许开发人员使用XAML和C#等编程语言来创建个性化的用户界面元素。自定义控件可以根据需求提供更多的功能和自定义化选项,以及更好的用户体验。

🚀一、Validation控件详解

在WPF中,可以使用Validation控件来实现输入验证。Validation控件可以帮助我们在用户输入数据时进行验证,确保数据的有效性。常用的Validation控件有:

  1. ValidationRule:可以用来验证单个属性或整个对象。可以自定义ValidationRule并将其应用到绑定属性上。

  2. IDataErrorInfo:这是一个接口,通过实现它,可以使绑定的元素支持数据验证。

  3. Validation.ErrorTemplate:可以定义一个用于显示错误信息的模板,当验证失败时,该模板会自动显示。

示例:

XAML:

<TextBox x:Name="textBox" Validation.ErrorTemplate="{StaticResource ErrorTemplate}"
         Text="{Binding Name, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" />

其中,ValidatesOnDataErrors和NotifyOnValidationError属性都是用于开启数据验证功能。

ErrorTemplate定义:

<ControlTemplate x:Key="ErrorTemplate">
    <DockPanel>
        <TextBlock DockPanel.Dock="Top" Foreground="Red" Text="Error:" />
        <Border BorderBrush="Red" BorderThickness="1">
            <AdornedElementPlaceholder />
        </Border>
    </DockPanel>
</ControlTemplate>

这个模板会在验证失败时,显示一个红色边框和一条错误文本。你可以根据自己的需求来修改模板。

ValidationRule使用:

<TextBox x:Name="textBox">
    <TextBox.Text>
        <Binding Path="Age" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:IntRangeValidationRule Minimum="18" Maximum="60" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

IntRangeValidationRule是一个自定义的ValidationRule,用于验证用户输入的年龄是否在18-60之间。在用户输入年龄时,会自动调用IntRangeValidationRule的Validate方法,进行验证。如果验证失败,就会显示错误信息。

🔎1.属性介绍

WPF中Validation控件的属性包括:

  1. ValidationRule:用于指定要应用的验证规则。可以使用内置的验证规则,也可以创建自定义的验证规则。

  2. ValidatesOnExceptions:指示是否应该在发生异常时进行验证。默认情况下,此属性为true,当绑定源发生异常时,会显示验证错误消息。

  3. ValidatesOnDataErrors:指示在数据对象实现了IDataErrorInfo接口时是否要进行验证。如果设置为true,则在数据对象中的实现中指定的验证逻辑将自动应用。

  4. NotifyOnValidationError:指示是否应向目标属性通知验证错误。如果设置为true,则在发现验证错误时,会触发PropertyValueChanged事件。

  5. UpdateSourceTrigger:指示何时应该更新源属性的值。可以设置为PropertyChanged、LostFocus或Explicit。

  6. ValidatesOnNotifyDataErrors:指示是否在数据对象实现了INotifyDataErrorInfo接口时进行验证。如果设置为true,则在数据对象中的实现中指定的验证逻辑将自动应用。

  7. ValidationStep:指定验证发生的时间。可以设置为RawProposedValue、ConvertedProposedValue或UpdatedValue。

  8. ValidatesOnExceptions:指示是否应该在发生异常时进行验证。默认情况下,此属性为true,当绑定源发生异常时,会显示验证错误消息。

🔎2.常用场景

WPF中Validation控件常用场景有:

  1. 表单验证:在用户输入数据时,需要对数据进行验证,以确保数据的正确性。Validation控件可以帮助我们实现对数据的验证,并在验证未通过时提示用户错误信息。

  2. 数据绑定:Validation控件可以与数据绑定一起使用,帮助我们验证用户输入的数据是否符合数据绑定规则。

  3. 控件状态验证:在某些情况下,我们需要验证控件的状态是否正确,例如,验证复选框是否被选中,是否勾选了至少一项等。

  4. 数据验证规则:WPF中的Validation控件允许我们创建自定义的数据验证规则,以满足不同的验证需求。

Validation控件是一个非常强大的工具,可以帮助我们实现各种数据验证需求,提高应用程序的可靠性和易用性。

🔎3.具体案例

在WPF中使用Validation控件可以方便地验证用户输入,下面是一个具体的案例:

假设有一个注册窗口,用户需要输入用户名、密码和电子邮件地址。我们需要对用户的输入进行验证,确保它们满足一定的要求。首先,在XAML中,我们可以定义这些输入框和Validation控件:

<Window>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <StackPanel>
            <TextBox Text="{Binding Username, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
            <PasswordBox Password="{Binding Password, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
            <TextBox Text="{Binding Email, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
        </StackPanel>
        <Button Grid.Row="1" Content="Register" Command="{Binding RegisterCommand}" />
    </Grid>
</Window>

这里我们将三个输入框分别绑定到ViewModel中的Username、Password和Email属性,并将UpdateSourceTrigger设置为PropertyChanged,这样每次用户输入内容时都会触发属性的更新。同时,我们设置ValidatesOnDataErrors为True,这样就会自动触发Validation控件。

接下来,在ViewModel中定义这些属性和验证规则:

public class RegisterViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    private string _username;
    public string Username
    {
        get { return _username; }
        set
        {
            _username = value;
            OnPropertyChanged(nameof(Username));
        }
    }

    private string _password;
    public string Password
    {
        get { return _password; }
        set
        {
            _password = value;
            OnPropertyChanged(nameof(Password));
        }
    }

    private string _email;
    public string Email
    {
        get { return _email; }
        set
        {
            _email = value;
            OnPropertyChanged(nameof(Email));
        }
    }

    public string Error => null;

    public string this[string columnName]
    {
        get
        {
            string error = null;
            switch (columnName)
            {
                case "Username":
                    if (string.IsNullOrWhiteSpace(Username))
                    {
                        error = "Username is required.";
                    }
                    break;
                case "Password":
                    if (string.IsNullOrWhiteSpace(Password))
                    {
                        error = "Password is required.";
                    }
                    break;
                case "Email":
                    if (string.IsNullOrWhiteSpace(Email))
                    {
                        error = "Email is required.";
                    }
                    else if (!Regex.IsMatch(Email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$"))
                    {
                        error = "Email is invalid.";
                    }
                    break;
            }
            return error;
        }
    }

    public ICommand RegisterCommand { get; }

    public RegisterViewModel()
    {
        RegisterCommand = new RelayCommand(Register, CanRegister);
    }

    private bool CanRegister()
    {
        return !string.IsNullOrWhiteSpace(Username) &&
            !string.IsNullOrWhiteSpace(Password) &&
            !string.IsNullOrWhiteSpace(Email) &&
            !this[nameof(Username)].Any() &&
            !this[nameof(Password)].Any() &&
            !this[nameof(Email)].Any();
    }

    private void Register()
    {
        // register logic here
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

在上面的代码中,我们实现了INotifyPropertyChanged接口和IDataErrorInfo接口,这样我们就可以对属性的变化进行通知,并且定义验证规则返回错误信息。由于我们使用了IDataErrorInfo接口,Validation控件会自动检查托管数据源的错误。我们还实现了RegisterCommand的CanExecute方法,这个方法检查所有属性是否满足要求,如果满足则返回true,否则返回false,这样Register按钮的IsEnabled属性就会自动生效。

这是一个简单的WPF中Validation控件的案例,通过这个案例,我们可以看出Validation控件的便利性和使用方法。


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。