首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【愚公系列】2023年09月 WPF控件专题 XAML介绍
2
【愚公系列】2023年09月 WPF控件专题 WPF应用程序组成
3
【愚公系列】2023年09月 WPF控件专题 Window窗体属性和事件
4
【愚公系列】2023年09月 WPF控件专题 Label、TextBox、PasswordBox控件介绍
5
【愚公系列】2023年09月 WPF控件专题 Button控件详解
6
【愚公系列】2023年09月 WPF控件专题 RadioButton控件详解
7
【愚公系列】2023年09月 WPF控件专题 CheckBox控件详解
8
【愚公系列】2023年09月 WPF控件专题 Image控件详解
9
【愚公系列】2023年09月 WPF控件专题 Border控件详解
10
【愚公系列】2023年09月 WPF控件专题 ComboBox控件详解
11
【愚公系列】2023年09月 WPF控件专题 ListBox控件详解
12
【愚公系列】2023年09月 WPF控件专题 DatePicker控件详解
13
【愚公系列】2023年09月 WPF控件专题 Calendar控件详解
14
【愚公系列】2023年09月 WPF控件专题 Slider控件详解
15
【愚公系列】2023年09月 WPF控件专题 ProgressBar控件详解
16
【愚公系列】2023年10月 WPF控件专题 StackPanel控件详解
17
【愚公系列】2023年10月 WPF控件专题 WrapPanel控件详解
18
【愚公系列】2023年10月 WPF控件专题 DockPanel控件详解
19
【愚公系列】2023年10月 WPF控件专题 Canvas控件详解
20
【愚公系列】2023年10月 WPF控件专题 Grid控件详解
21
【愚公系列】2023年10月 WPF控件专题 Groupbox控件详解
22
【愚公系列】2023年10月 WPF控件专题 Expander控件详解
23
【愚公系列】2023年10月 WPF控件专题 TabControl控件详解
24
【愚公系列】2023年10月 WPF控件专题 Frame控件详解
25
【愚公系列】2023年10月 WPF控件专题 ListView控件详解
26
【愚公系列】2023年10月 WPF控件专题 DataGrid控件详解
27
【愚公系列】2023年10月 WPF控件专题 Menu控件详解
28
【愚公系列】2023年10月 WPF控件专题 ContextMenu控件详解
29
【愚公系列】2023年10月 WPF控件专题 TreeView控件详解
30
【愚公系列】2023年10月 WPF控件专题 ToolBar控件详解
31
【愚公系列】2023年10月 WPF控件专题 ToolBarTray控件详解
32
【愚公系列】2023年10月 WPF控件专题 StatusBar控件详解
33
【愚公系列】2023年11月 WPF控件专题 MediaElement控件详解
34
【愚公系列】2023年11月 WPF控件专题 RichTextBox控件详解
35
【愚公系列】2023年11月 WPF控件专题 GridView控件详解
36
【愚公系列】2023年11月 WPF控件专题 Rectangle控件详解
37
【愚公系列】2023年11月 WPF控件专题 Popup控件详解
38
【愚公系列】2023年11月 WPF控件专题 OpenFileDialog控件详解
39
【愚公系列】2023年11月 WPF控件专题 SaveFileDialog控件详解
40
【愚公系列】2023年11月 WPF控件专题 RepeatButton控件详解
41
【愚公系列】2023年11月 WPF控件专题 Ellipse控件详解
42
【愚公系列】2023年11月 WPF控件专题 Polygon控件详解
43
【愚公系列】2023年11月 WPF控件专题 Path控件详解
44
【愚公系列】2023年11月 WPF控件专题 WindowFormsHost控件详解
45
【愚公系列】2023年11月 WPF控件专题 WebBrowser控件详解
46
【愚公系列】2023年11月 WPF控件专题 Validation控件详解
47
【愚公系列】2023年11月 WPF控件专题 Page控件详解
48
【愚公系列】2023年11月 WPF控件专题 PrintDialog控件详解
49
【愚公系列】2023年11月 WPF控件专题 Track控件详解
50
【愚公系列】2023年11月 WPF控件专题 Polyline控件详解

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

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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:

代码语言:html
复制
<TextBox x:Name="textBox" Validation.ErrorTemplate="{StaticResource ErrorTemplate}"
         Text="{Binding Name, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" />

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

ErrorTemplate定义:

代码语言:html
复制
<ControlTemplate x:Key="ErrorTemplate">
    <DockPanel>
        <TextBlock DockPanel.Dock="Top" Foreground="Red" Text="Error:" />
        <Border BorderBrush="Red" BorderThickness="1">
            <AdornedElementPlaceholder />
        </Border>
    </DockPanel>
</ControlTemplate>

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

ValidationRule使用:

代码语言:html
复制
<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控件:

代码语言:html
复制
<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中定义这些属性和验证规则:

代码语言:c#
复制
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控件的便利性和使用方法。


我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

下一篇
举报
领券