提问人:Alexander 提问时间:7/12/2023 最后编辑:Kiran ShahiAlexander 更新时间:7/29/2023 访问量:64
使用 .NET 库 FluentValidation 的 WPF-UserControl
WPF-UserControl with the .NET library FluentValidation
问:
我将 WPF 与 MVVM 一起使用,并使用 .NET 库 FluentValidation (https://github.com/FluentValidation) 进行验证。 使用 TextBox 和简单的验证
RuleFor(x => x.Name).NotEmpty().WithMessage("No empty name.");
它有效。如果文本框为空,则框架和字段将变为红色。 验证不适用于也只有用于测试的 TextBox 的 UserControl。框架和字段不会变为红色。我没有收到任何消息。
我在文档中找不到有关使用 UserControl 进行验证的任何内容。 有没有人有这方面的经验,可以给我一个提示?
答:
0赞
Pinky
7/29/2023
#1
在 WPF 中,在 xaml 中使用很重要。你用过吗?AdornerDecorator
<AdornerDecorator>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Margin="3" Text="Name: " />
<TextBox Grid.Row="0" Grid.Column="1"
Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Grid.Row="0" Grid.Column="2" Margin="3" MaxWidth="150" TextWrapping="Wrap"
Text="Name not empty, not equal 'foo' and max length is 16" />
<TextBlock Grid.Row="1" Grid.Column="0" Margin="3" Text="Surname: " />
<TextBox Grid.Row="1" Grid.Column="1"
Text="{Binding Surname, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Grid.Row="1" Grid.Column="2" Margin="3" MaxWidth="150" TextWrapping="Wrap"
Text="Surname should be equal 'foo'" />
<TextBlock Grid.Row="2" Grid.Column="0" Margin="3" Text="Phone number: " />
<TextBox Grid.Row="2" Grid.Column="1"
Text="{Binding PhoneNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Grid.Row="2" Grid.Column="2" Margin="3" MaxWidth="150" TextWrapping="Wrap"
Text="Phone number required and allow from 9 to 12 digits" />
</Grid>
</AdornerDecorator>
此外,您还可以使用具有 fluent-interface 和内置 MVVM 支持的库 https://github.com/Karnah/ReactiveValidation。 样本:
public class CarViewModel : ValidatableObject
{
public CarViewModel()
{
Validator = GetValidator();
}
private IObjectValidator GetValidator()
{
var builder = new ValidationBuilder<CarViewModel>();
builder.RuleFor(vm => vm.Make).NotEmpty();
builder.RuleFor(vm => vm.Model).NotEmpty().WithMessage("Please specify a car model");
builder.RuleFor(vm => vm.Mileage).GreaterThan(0).When(model => model.HasMileage);
builder.RuleFor(vm => vm.Vin).Must(BeAValidVin).WithMessage("Please specify a valid VIN");
builder.RuleFor(vm => vm.Description).Length(10, 100);
return builder.Build(this);
}
private bool BeAValidVin(string vin)
{
// Custom vin validating logic goes here.
}
// Properties with realization INotifyPropertyChanged goes here.
}
下面是 WPF 应用程序的快速入门:https://github.com/Karnah/ReactiveValidation/wiki/WPF.-Quick-start
评论