使用 .NET 库 FluentValidation 的 WPF-UserControl

WPF-UserControl with the .NET library FluentValidation

提问人:Alexander 提问时间:7/12/2023 最后编辑:Kiran ShahiAlexander 更新时间:7/29/2023 访问量:64

问:

我将 WPF 与 MVVM 一起使用,并使用 .NET 库 FluentValidation (https://github.com/FluentValidation) 进行验证。 使用 TextBox 和简单的验证

RuleFor(x => x.Name).NotEmpty().WithMessage("No empty name.");

它有效。如果文本框为空,则框架和字段将变为红色。 验证不适用于也只有用于测试的 TextBox 的 UserControl。框架和字段不会变为红色。我没有收到任何消息。

我在文档中找不到有关使用 UserControl 进行验证的任何内容。 有没有人有这方面的经验,可以给我一个提示?

WPF 验证

评论

0赞 Sheriff 7/13/2023
你能展示更多你的源代码(xaml、viewmodel)来复制它吗?我刚刚使用此示例 gist.github.com/GrantByrne/11243164 尝试了 .NET 库 FluentValidation,它适用于 Window,甚至对 UserControl 几乎没有更改。您不是忘记将 DataContext 设置为 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