🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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#等编程语言来创建个性化的用户界面元素。自定义控件可以根据需求提供更多的功能和自定义化选项,以及更好的用户体验。
在WPF中,可以使用Validation控件来实现输入验证。Validation控件可以帮助我们在用户输入数据时进行验证,确保数据的有效性。常用的Validation控件有:
示例:
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方法,进行验证。如果验证失败,就会显示错误信息。
WPF中Validation控件的属性包括:
WPF中Validation控件常用场景有:
Validation控件是一个非常强大的工具,可以帮助我们实现各种数据验证需求,提高应用程序的可靠性和易用性。
在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控件的便利性和使用方法。