ReactiveUI.Validation 4.0.9

前缀已保留
dotnet add package ReactiveUI.Validation --version 4.0.9                
NuGet\Install-Package ReactiveUI.Validation -Version 4.0.9                
此命令打算在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="ReactiveUI.Validation" Version="4.0.9" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以便引用此包。
paket add ReactiveUI.Validation --version 4.0.9                
#r "nuget: ReactiveUI.Validation, 4.0.9"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此复制到交互式工具或脚本的源代码中以便引用此包。
// Install ReactiveUI.Validation as a Cake Addin
#addin nuget:?package=ReactiveUI.Validation&version=4.0.9

// Install ReactiveUI.Validation as a Cake Tool
#tool nuget:?package=ReactiveUI.Validation&version=4.0.9                

NuGet Stats Build Code Coverage #yourfirstpr Downloads Slack

<a href="https://github.com/reactiveui/ReactiveUI.Validation"> <img width="140" heigth="140" src="https://github.com/reactiveui/ReactiveUI.Validation/blob/main/media/logo.png"> </a>

ReactiveUI.Validation

ReactiveUI 基础解决方案的验证,以响应式方式运行。《code>ReactiveUI.Validation最初由@jcmm33开发,最初名为Vistian.Reactive.Validation,后来由Àlex Martínez MorónReactiveUI 核心团队重构和更新。《code>ReactiveUI.Validation支持所有平台,包括.NET Framework、.NET Standard、.NET Core、Maui。

NuGet 包

将以下包安装到您的类库和具有特定平台的项目中。

平台 ReactiveUI 包 NuGet
任何平台 ReactiveUI.Validation CoreBadge
AndroidX (Maui, Xamarin) ReactiveUI.Validation.AndroidX DroXBadge
Xamarin.Android ReactiveUI.Validation.AndroidSupport DroBadge

使用方法

  • 对于需要验证的 ViewModel,实现 IValidatableViewModel
  • 使用 ValidationRule 扩展方法向 ViewModel 添加验证规则。
  • 通过 BindValidationINotifyDataErrorInfo 将 ViewModel 中的验证规则绑定到视图。

示例

  1. 使用 IValidatableViewModel 装饰现有的 ViewModel,该 ViewModel 有一个成员,ValidationContext。ValidationContext 包含围绕 ViewModel 验证的所有功能。对验证规则规范的访问主要通过对 IValidatableViewModel 接口的扩展方法来实现。然后,向 ViewModel 中添加验证。
using ReactiveUI.Validation.Extensions;

public class SampleViewModel : ReactiveObject, IValidatableViewModel
{
    public SampleViewModel()
    {
        // Creates the validation for the Name property.
        this.ValidationRule(
            viewModel => viewModel.Name,
            name => !string.IsNullOrWhiteSpace(name),
            "You must specify a valid name");
    }

    public ValidationContext ValidationContext { get; } = new ValidationContext();

    private string _name;
    public string Name
    {
        get => _name;
        set => this.RaiseAndSetIfChanged(ref _name, value);
    }
}

对于更复杂的验证场景,ValidationRule 扩展方法有更多的重载,接受可观察对象。这允许异步执行验证,并允许将复杂链的可观察对象组合产生验证结果。

最简单的一个接受一个 IObservable,所观察的布尔值指示 ValidationRule 是否有效。重载接受一个消息,当可观察产生一个 false(不有效)的结果时使用。

IObservable<bool> passwordsObservable =
    this.WhenAnyValue(
        x => x.Password,
        x => x.ConfirmPassword,
        (password, confirmation) => password == confirmation);

this.ValidationRule(
    vm => vm.ConfirmPassword,
    passwordsObservable,
    "Passwords must match.");

可以任何现有的可观察对象使用接受任意 IObservable 事件流的扩展方法来驱动一个 ValidationRule。重载接受一个自定义验证函数,它与最新的 TState一起提供,以及一个自定义错误消息函数,它负责格式化最新的 TState 对象。该语法如下

// IObservable<{ Password, Confirmation }>
var passwordsObservable =
    this.WhenAnyValue(
        x => x.Password,
        x => x.ConfirmPassword,
        (password, confirmation) =>
            new { Password = password, Confirmation = confirmation });

this.ValidationRule(
    vm => vm.ConfirmPassword,
    passwordsObservable,
    state => state.Password == state.Confirmation,
    state => $"Passwords must match: {state.Password} != {state.Confirmation}");

注意 当验证函数返回 false 时,提取消息()的功能才会被调用,否则消息设置为 string.Empty

最后,您可以直接提供一个流任何实现了 IValidationState 的对象(或结构体)的可观察对象;或者,您可以使用已经实现了该接口的 ValidationState 基类。由于结果对象直接存储在上下文而不进行进一步转换,这可能是最高效的方法

IObservable<IValidationState> usernameNotEmpty =
    this.WhenAnyValue(x => x.UserName)
        .Select(name => string.IsNullOrEmpty(name) 
            ? new ValidationState(false, "The username must not be empty")
            : ValidationState.Valid);

this.ValidationRule(vm => vm.UserName, usernameNotEmpty);

注意 由于有效的 ValidationState 实际上并不需要消息,因此有一个单例 ValidationState.Valid 属性,建议 whenever 可能时使用,以降低内存分配。

  1. 将验证呈现添加到视图。
using ReactiveUI.Validation.Extensions;

public class SampleView : ReactiveContentPage<SampleViewModel>
{
    public SampleView()
    {
        InitializeComponent();
        this.WhenActivated(disposables =>
        {
            this.Bind(ViewModel, vm => vm.Name, view => view.Name.Text)
                .DisposeWith(disposables);

            // Bind any validations that reference the Name property 
            // to the text of the NameError UI control.
            this.BindValidation(ViewModel, vm => vm.Name, view => view.NameError.Text)
                .DisposeWith(disposables);

            // Bind any validations attached to this particular view model
            // to the text of the FormErrors UI control.
            this.BindValidation(ViewModel, view => view.FormErrors.Text)
                .DisposeWith(disposables);
        });
    }
}

注意 Name 是一个 <Entry />NameError 是一个 <Label />FormErrors 同样是一个 <Label />。所有这些控件都来自 Xamarin.Forms 库。

包含 Android 扩展的示例

有针对 Xamarin.Android 及其材料设计控件 TextInputLayout 的扩展方法。这些扩展方法内部使用 TextInputLayout 控件的 Error 属性,允许您实现完全本地的显示验证错误的行为。要使用这些扩展,您必须导入 ReactiveUI.Validation.Extensions 并安装 ReactiveUI.Validation.AndroidSupportReactiveUI.Validation.AndroidX

dotnet add package ReactiveUI.Validation.AndroidX

注意:在 ReactiveUI.Validation 1.7 和更低版本 中,针对 Android 的扩展在 主包中提供,目标为 MonoAndroid90,您不需要安装 ReactiveUI.Validation.AndroidSupport。在 ReactiveUI.Validation 1.7 和更低版本 中,请使用 using ReactiveUI.Validation.Platforms.Android 代替 using ReactiveUI.Validation.Extensions

<img src="https://user-images.githubusercontent.com/6759207/96716730-15729480-13ae-11eb-928e-7e408b7ffac4.png" width="400" />

// This using directive makes Android-specific extensions available.
// Make sure to install either the ReactiveUI.Validation.AndroidSupport
// package or the ReactiveUI.Validation.AndroidX package.
using ReactiveUI.Validation.Extensions;

public class SignUpActivity : ReactiveAppCompatActivity<SignUpViewModel>
{
    // The Android native text boxes declared in an .axml file.
    public TextInputEditText Password { get; set; }
    public TextInputEditText ConfirmPassword { get; set; }

    // The layouts wrapping the text boxes declared in an .axml file.
    public TextInputLayout PasswordField { get; set; }
    public TextInputLayout ConfirmPasswordField { get; set; }

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);

        // The WireUpControls method is a magic ReactiveUI utility method for Android, see:
        // https://www.reactiveui.net/docs/handbook/data-binding/xamarin-android/wire-up-controls
        this.WireUpControls();
        this.Bind(ViewModel, x => x.Password, x => x.Password.Text);
        this.Bind(ViewModel, x => x.ConfirmPassword, x => x.ConfirmPassword.Text);

        // Bind any validations which reference the Password property 
        // to the Error property of the TextInputLayout control.
        this.BindValidation(ViewModel, x => x.Password, PasswordField);
        this.BindValidation(ViewModel, x => x.ConfirmPassword, ConfirmPasswordField);
    }
}

INotifyDataErrorInfo 支持

对于支持 INotifyDataErrorInfo 接口的平台,ReactiveUI.Validation 提供了一个名为 ReactiveValidationObject 的辅助基类。辅助类实现了 IValidatableViewModel 接口和 INotifyDataErrorInfo 接口。它侦听 ValidationContext 的任何更改并调用 INotifyDataErrorInfo 事件。

<img width="400" src="https://user-images.githubusercontent.com/6759207/96717163-bbbe9a00-13ae-11eb-8c54-89cd339cbd5c.png">

using ReactiveUI.Validation.Extensions;

public class SampleViewModel : ReactiveValidationObject
{
    public SampleViewModel()
    {
        this.ValidationRule(
            viewModel => viewModel.Name, 
            name => !string.IsNullOrWhiteSpace(name),
            "Name shouldn't be null or white space.");
    }

    private string _name = string.Empty;
    public string Name
    {
        get => _name;
        set => this.RaiseAndSetIfChanged(ref _name, value);
    }
}

注意:请注意,INotifyDataErrorInfo 仅通过 XAML 绑定支持。ReactiveUI 绑定不使用 WPF 内置的类。

当使用接受可观察对象的 ValidationRule 重载时,请记住提供作为目标属性的第一个参数。否则,无法确定错误信息是为了哪个属性。

this.ValidationRule(
    vm => vm.ConfirmPassword,
    passwordsObservable,
    "Passwords must match.");

自定义格式化程序

如果您想覆盖验证库中使用的默认 SingleLineFormatter,可以将 IValidationTextFormatter<T> 的实例传递给 BindValidation。默认情况下,SingleLineFormatter 接受一个分隔符字符并使用默认空白字符,下面的代码示例显示了如何使用非默认分隔符字符。

// This formatter is based on the default SingleLineFormatter but uses a custom separator char.
var formatter = new SingleLineFormatter(Environment.NewLine);
this.BindValidation(ViewModel, x => x.ErrorLabel.Text, formatter)
    .DisposeWith(disposables);

最简单的自定义 IValidationTextFormatter<TOut> 实现可能如下所示。

private class ConstFormatter : IValidationTextFormatter<string>
{
    private readonly string _text;

    public ConstFormatter(string text = "The input is invalid.") => _text = text;

    public string Format(ValidationText validationText) => _text;
}

// This formatter is based on a custom IValidationTextFormatter implementation.
var formatter = new ConstFormatter("The input is invalid.");
this.BindValidation(ViewModel, x => x.ErrorLabel.Text, formatter)
    .DisposeWith(disposables);

如果您想要覆盖 ReactiveUI.Validation 中默认使用的 IValidationTextFormatter<string>,请在使用应用程序之前将 IValidationTextFormatter<string> 的实例注册到 Locator.CurrentMutable 中。这可能在您的应用程序需要本地化并且您希望将消息键而不是消息传递给 ValidationRule 调用的情况中很有用。

// Register a singleton instance of IValidationTextFormatter<string> into Splat.Locator.
Locator.CurrentMutable.RegisterConstant(new CustomFormatter(), typeof(IValidationTextFormatter<string>));

功能

本质上,ReactiveUI.Validation 是一个相对简单的模型,包含一个包含 IValidationComponent 实例列表的 ValidationContext。一个 IValidationComponent 提供一个 IValidationState 的可观察对象。每当验证状态改变(无论是有效性转换还是 ValidationText 改变),都会推出一个新的值。

  1. 规则可以由单个或多个属性以及更通用的可观察对象组成。
  2. 验证文本可以封装有效和无效的状态。
  3. 绑定可以到视图或动作。
  4. 验证文本可以引用 ViewModel 或构成验证规则的属性,例如,将作为验证消息一部分输入的文本包含在验证文本中。
  5. 可以使用自定义格式化程序调整验证文本输出,不仅允许单行和多行输出,而且对于 Android 等平台,可以实现更丰富的渲染(例如粗体/斜体)。

反馈

请使用 GitHub 问题 进行提问、评论或错误报告。

贡献

ReactiveUI.Validation 在 OSI 批准的开源许可证下开发,使其可以免费使用和分发,包括商业用途。我们喜欢参与此项目的人,并且我们希望您加入我们,尤其是如果您刚开始或以前从未为开源做出过贡献。

所以,为想要加入我们这位可爱的人致敬——这是您支持我们的方式

代码发布在MIT许可下。

产品 兼容和额外的计算目标框架版本。
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net6.0-windows10.0.17763 is compatible.  net7.0 is compatible.  net7.0-android was computed.  net7.0-android33.0 is compatible.  net7.0-ios was computed.  net7.0-ios16.1 is compatible.  net7.0-maccatalyst was computed.  net7.0-maccatalyst16.1 is compatible.  net7.0-macos was computed.  net7.0-macos13.0 is compatible.  net7.0-tvos was computed.  net7.0-tvos16.1 is compatible.  net7.0-windows was computed.  net7.0-windows10.0.17763 is compatible.  net8.0 is compatible.  net8.0-android was computed.  net8.0-android34.0 is compatible.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-ios17.2 is compatible.  net8.0-maccatalyst was computed.  net8.0-maccatalyst17.2 is compatible.  net8.0-macos was computed.  net8.0-macos14.2 is compatible.  net8.0-tvos was computed.  net8.0-tvos17.2 is compatible.  net8.0-windows was computed.  net8.0-windows10.0.17763 is compatible. 
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET Framework net461 已计算。 net462 兼容。 net463 已计算。 net47 已计算。 net471 已计算。 net472 兼容。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解更多关于目标框架.NET Standard的信息。

NuGet 包 (11)

显示依赖于 ReactiveUI.Validation 的前 5 个 NuGet 包

下载
Zafiro.UI

Zafiro 库的用户交互精美实现

ArtemisRGB.UI.Shared

包描述

Zafiro.Avalonia.FileExplorer

包描述

KH.UIBase

InstrumentBaseLib

Acorisoft.Island

Island 设计语言(预览版)

GitHub 仓库 (16)

显示依赖于 ReactiveUI.Validation 的前 5 个最受欢迎的 GitHub 仓库

仓库 星级
2dust/v2rayN
Windows 的图形客户端,支持 Xray 核心、v2fly 核心以及其他
shadowsocks/shadowsocks-windows
shadowsocks 的 C# 实现
AvaloniaUI/Avalonia
使用 C# 和 XAML 开发桌面、嵌入式、移动和 WebAssembly 应用。最受欢迎的 .NET UI 客户端技术之一
2dust/clashN
Windows 的 Clash 客户端,支持 Mihomo
Artemis-RGB/Artemis
提供跨多个品牌 RGB 游戏外设的高级统一照明
版本 下载 最后更新
4.0.9 8,112 5/11/2024
4.0.6 446 5/7/2024
3.1.7 88,108 2/1/2023
3.0.22 51,563 11/25/2022
3.0.1 28,936 6/28/2022
2.2.1 63,506 9/29/2021
2.1.1 54,104 1/22/2021
2.0.1 4,046 12/13/2020
1.8.6 12,162 10/22/2020
1.8.1 1,094 10/19/2020
1.7.1 1,729 10/15/2020
1.6.4 1,099 10/12/2020
1.5.5 6,113 7/28/2020
1.5.3 1,117 7/26/2020
1.4.15 15,287 5/7/2020
1.4.13 4,906 4/1/2020
1.4.10 9,069 1/31/2020
1.4.8 1,043 1/31/2020
1.4.7 2,147 1/14/2020
1.4.6 1,666 12/26/2019
1.4.1 11,543 9/21/2019
1.3.1 966 9/21/2019
1.2.1 8,343 5/13/2019
1.1.1 13,763 5/7/2019
1.0.13 1,221 4/1/2019
1.0.3 1,289 2/26/2019
1.0.2 999 2/26/2019
1.0.0 1,353 7/26/2020