From 5ecc8ec19e523a575657245c873ca0441366d784 Mon Sep 17 00:00:00 2001 From: "Artyom V. Gorchakov" Date: Thu, 10 Dec 2020 01:47:39 +0300 Subject: [PATCH] feature: Add .NET 5 (#170) * feature: Add .NET 5 * Use NetAnalyzers * build(deps): bump Microsoft.NET.Test.Sdk from 16.8.0 to 16.8.3 Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 16.8.0 to 16.8.3. - [Release notes](https://github.com/microsoft/vstest/releases) - [Commits](https://github.com/microsoft/vstest/compare/v16.8.0...v16.8.3) Signed-off-by: dependabot-preview[bot] * build(deps): bump DiffEngine from 6.1.4 to 6.4.6 Bumps [DiffEngine](https://github.com/VerifyTests/DiffEngine) from 6.1.4 to 6.4.6. - [Release notes](https://github.com/VerifyTests/DiffEngine/releases) - [Commits](https://github.com/VerifyTests/DiffEngine/commits) Signed-off-by: dependabot-preview[bot] * build(deps): bump Microsoft.Reactive.Testing from 4.4.1 to 5.0.0 Bumps [Microsoft.Reactive.Testing](https://github.com/dotnet/reactive) from 4.4.1 to 5.0.0. - [Release notes](https://github.com/dotnet/reactive/releases) - [Commits](https://github.com/dotnet/reactive/compare/rxnet-v4.4.1...ixnet-v5.0.0) Signed-off-by: dependabot-preview[bot] * Use net5.0, add Windows targets * Fix nullability errors * Approve the new API * Remove obsolete APIs from the library code * Approve the changed public APIs * Update .NET 472 approved APIs * Use the new API in the template file * Add .NET Framework 4.6.1 target * Add net461 target into the unit tests project * add netcoreapp3.1 installer Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Glenn <5834289+glennawatson@users.noreply.github.com> --- .editorconfig | 66 +++- .github/workflows/ci-build.yml | 17 +- src/Directory.build.props | 2 +- ...eactiveUI.Validation.AndroidSupport.csproj | 6 +- .../ReactiveUI.Validation.AndroidX.csproj | 6 +- ...ests.ValidationProject.net461.approved.txt | 303 ++++++++++++++++ ...ests.ValidationProject.net472.approved.txt | 149 +------- ...ests.ValidationProject.net5.0.approved.txt | 303 ++++++++++++++++ ...lidationProject.netcoreapp3.1.approved.txt | 147 +------- .../ReactiveUI.Validation.Tests.csproj | 4 +- .../Collections/ValidationText.cs | 93 +---- .../IPropertyValidationComponent.cs | 14 - .../Abstractions/IValidatesProperties.cs | 24 -- .../Components/BasePropertyValidation.cs | 18 +- .../Components/ModelObservableValidation.cs | 337 ------------------ .../Components/ObservableValidation.cs | 16 +- .../Contexts/ValidationContext.cs | 2 +- .../Extensions/ExpressionExtensions.cs | 6 +- .../ValidatableViewModelExtensions.cs | 287 --------------- .../Extensions/ValidationContextExtensions.cs | 126 ------- .../Extensions/ViewForExtensions.cs | 94 ----- .../Helpers/ReactiveValidationObject.cs | 29 -- .../ReactiveUI.Validation.csproj | 6 +- .../States/ValidationState.cs | 35 -- .../PropertyValidationGenerator.cs | 10 +- .../PropertyValidationGenerator.tt | 2 +- .../ValidationBindings/ValidationBinding.cs | 2 +- 27 files changed, 703 insertions(+), 1401 deletions(-) create mode 100644 src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net461.approved.txt create mode 100644 src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net5.0.approved.txt delete mode 100755 src/ReactiveUI.Validation/Components/ModelObservableValidation.cs diff --git a/.editorconfig b/.editorconfig index 8a7cddf7..3a2d4f8e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -29,9 +29,13 @@ csharp_new_line_between_query_expression_clauses = true csharp_indent_block_contents = true csharp_indent_braces = false csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true csharp_indent_switch_labels = true csharp_indent_labels = one_less_than_current +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + # avoid this. unless absolutely necessary dotnet_style_qualification_for_field = false:suggestion dotnet_style_qualification_for_property = false:suggestion @@ -40,10 +44,13 @@ dotnet_style_qualification_for_event = false:suggestion # only use var when it's obvious what the variable type is csharp_style_var_for_built_in_types = false:none -csharp_style_var_when_type_is_apparent = false:suggestion -csharp_style_var_elsewhere = false:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion +csharp_style_var_elsewhere = true:suggestion -# use language keywords instead of BCL types +# Types: use keywords instead of BCL types, and permit var only when the type is clear +csharp_style_var_for_built_in_types = false:suggestion +csharp_style_var_when_type_is_apparent = false:none +csharp_style_var_elsewhere = false:suggestion dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion dotnet_style_predefined_type_for_member_access = true:suggestion @@ -51,33 +58,42 @@ dotnet_style_predefined_type_for_member_access = true:suggestion dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style - dotnet_naming_symbols.constant_fields.applicable_kinds = field dotnet_naming_symbols.constant_fields.required_modifiers = const - dotnet_naming_style.pascal_case_style.capitalization = pascal_case # static fields should have s_ prefix +dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields +dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style dotnet_naming_symbols.static_fields.applicable_kinds = field dotnet_naming_symbols.static_fields.required_modifiers = static - -dotnet_naming_style.static_prefix_style.capitalization = camel_case +dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected +dotnet_naming_style.static_prefix_style.required_prefix = s_ +dotnet_naming_style.static_prefix_style.capitalization = camel_case # internal and private fields should be _camelCase dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style - dotnet_naming_symbols.private_internal_fields.applicable_kinds = field dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal - dotnet_naming_style.camel_case_underscore_style.required_prefix = _ -dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case # Code style defaults +csharp_using_directive_placement = outside_namespace:suggestion dotnet_sort_system_directives_first = true -csharp_preserve_single_line_blocks = true -csharp_preserve_single_line_statements = false +csharp_prefer_braces = true:silent +csharp_preserve_single_line_blocks = true:none +csharp_preserve_single_line_statements = false:none +csharp_prefer_static_local_function = true:suggestion +csharp_prefer_simple_using_statement = false:none +csharp_style_prefer_switch_expression = true:suggestion + +# Code quality +dotnet_style_readonly_field = true:suggestion +dotnet_code_quality_unused_parameters = non_public:suggestion # Expression-level preferences dotnet_style_object_initializer = true:suggestion @@ -85,14 +101,23 @@ dotnet_style_collection_initializer = true:suggestion dotnet_style_explicit_tuple_names = true:suggestion dotnet_style_coalesce_expression = true:suggestion dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +csharp_prefer_simple_default_expression = true:suggestion # Expression-bodied members -csharp_style_expression_bodied_methods = false:none -csharp_style_expression_bodied_constructors = false:none -csharp_style_expression_bodied_operators = false:none +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_constructors = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion csharp_style_expression_bodied_properties = true:suggestion -csharp_style_expression_bodied_indexers = true:none -csharp_style_expression_bodied_accessors = true:none +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion +csharp_style_expression_bodied_lambdas = true:suggestion +csharp_style_expression_bodied_local_functions = true:suggestion # Pattern matching csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion @@ -103,6 +128,11 @@ csharp_style_inlined_variable_declaration = true:suggestion csharp_style_throw_expression = true:suggestion csharp_style_conditional_delegate_call = true:suggestion +# Other features +csharp_style_prefer_index_operator = false:none +csharp_style_prefer_range_operator = false:none +csharp_style_pattern_local_over_anonymous_function = false:none + # Space preferences csharp_space_after_cast = false csharp_space_after_colon_in_inheritance_clause = true @@ -152,4 +182,4 @@ indent_size = 2 [*.sh] end_of_line = lf [*.{cmd, bat}] -end_of_line = crlf \ No newline at end of file +end_of_line = crlf diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index cce84afd..20385cdd 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -22,11 +22,23 @@ jobs: with: fetch-depth: 0 - - name: Install .NET Core + - name: Install .NET Core 3.1.x uses: actions/setup-dotnet@v1 with: dotnet-version: 3.1.x + - name: Install .NET 5.0.x + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.x + + - name: Add MSBuild to PATH + uses: glennawatson/setup-msbuild@v1.0.3 + + - name: Update VS2019 + shell: powershell + run: Start-Process -Wait -PassThru -FilePath "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vs_installer.exe" -ArgumentList "update --passive --norestart --installpath ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise""" + - name: NBGV id: nbgv uses: dotnet/nbgv@master @@ -36,9 +48,6 @@ jobs: - name: NuGet Restore run: dotnet restore working-directory: src - - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v1 - name: Build run: msbuild /t:build,pack /maxcpucount /p:NoPackageAnalysis=true /verbosity:minimal /p:Configuration=${{ env.configuration }} diff --git a/src/Directory.build.props b/src/Directory.build.props index c8b28384..4e85d185 100644 --- a/src/Directory.build.props +++ b/src/Directory.build.props @@ -39,7 +39,7 @@ - + diff --git a/src/ReactiveUI.Validation.AndroidSupport/ReactiveUI.Validation.AndroidSupport.csproj b/src/ReactiveUI.Validation.AndroidSupport/ReactiveUI.Validation.AndroidSupport.csproj index 7294354e..6dd1c76c 100644 --- a/src/ReactiveUI.Validation.AndroidSupport/ReactiveUI.Validation.AndroidSupport.csproj +++ b/src/ReactiveUI.Validation.AndroidSupport/ReactiveUI.Validation.AndroidSupport.csproj @@ -1,7 +1,7 @@  - MonoAndroid90 + MonoAndroid10.0 Provides ReactiveUI.Validation extensions for the Android Support Library ReactiveUI.Validation.AndroidSupport $(NoWarn);CS1591 @@ -11,8 +11,8 @@ - - + + diff --git a/src/ReactiveUI.Validation.AndroidX/ReactiveUI.Validation.AndroidX.csproj b/src/ReactiveUI.Validation.AndroidX/ReactiveUI.Validation.AndroidX.csproj index 522716eb..df17d395 100644 --- a/src/ReactiveUI.Validation.AndroidX/ReactiveUI.Validation.AndroidX.csproj +++ b/src/ReactiveUI.Validation.AndroidX/ReactiveUI.Validation.AndroidX.csproj @@ -1,7 +1,7 @@  - MonoAndroid90 + MonoAndroid10.0 Provides ReactiveUI.Validation extensions for the AndroidX Library ReactiveUI.Validation.AndroidX $(NoWarn);CS1591 @@ -11,8 +11,8 @@ - - + + diff --git a/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net461.approved.txt b/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net461.approved.txt new file mode 100644 index 00000000..9edf829f --- /dev/null +++ b/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net461.approved.txt @@ -0,0 +1,303 @@ +[assembly: System.Reflection.AssemblyMetadata("RepositoryUrl", "https://github.com/reactiveui/reactiveui.validation")] +[assembly: System.Runtime.Versioning.TargetFramework(".NETFramework,Version=v4.6.1", FrameworkDisplayName=".NET Framework 4.6.1")] +namespace ReactiveUI.Validation.Abstractions +{ + public interface IValidatableViewModel + { + ReactiveUI.Validation.Contexts.ValidationContext ValidationContext { get; } + } +} +namespace ReactiveUI.Validation.Collections +{ + public class ValidationText : System.Collections.Generic.IEnumerable, System.Collections.IEnumerable + { + public static readonly ReactiveUI.Validation.Collections.ValidationText Empty; + public static readonly ReactiveUI.Validation.Collections.ValidationText None; + public int Count { get; } + public string this[int index] { get; } + public System.Collections.Generic.IEnumerator GetEnumerator() { } + public string ToSingleLine(string? separator = ",") { } + public static ReactiveUI.Validation.Collections.ValidationText Create(System.Collections.Generic.IEnumerable validationTexts) { } + public static ReactiveUI.Validation.Collections.ValidationText Create(System.Collections.Generic.IEnumerable validationTexts) { } + public static ReactiveUI.Validation.Collections.ValidationText Create(params string[] validationTexts) { } + } +} +namespace ReactiveUI.Validation.Comparators +{ + public class ValidationStateComparer : System.Collections.Generic.EqualityComparer + { + public ValidationStateComparer() { } + public override bool Equals(ReactiveUI.Validation.States.IValidationState x, ReactiveUI.Validation.States.IValidationState y) { } + public override int GetHashCode(ReactiveUI.Validation.States.IValidationState obj) { } + } +} +namespace ReactiveUI.Validation.Components.Abstractions +{ + public interface IPropertyValidationComponent : ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent { } + public interface IValidatesProperties + { + System.Collections.Generic.IEnumerable Properties { get; } + int PropertyCount { get; } + bool ContainsPropertyName(string propertyName, bool exclusively = false); + } + public interface IValidationComponent + { + bool IsValid { get; } + ReactiveUI.Validation.Collections.ValidationText? Text { get; } + System.IObservable ValidationStatusChange { get; } + } +} +namespace ReactiveUI.Validation.Components +{ + public abstract class BasePropertyValidation : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + { + protected BasePropertyValidation() { } + public bool IsValid { get; } + public System.Collections.Generic.IEnumerable Properties { get; } + public int PropertyCount { get; } + public ReactiveUI.Validation.Collections.ValidationText? Text { get; } + public System.IObservable ValidationStatusChange { get; } + protected void AddProperty(System.Linq.Expressions.Expression> property) { } + public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } + public void Dispose() { } + protected virtual void Dispose(bool disposing) { } + protected abstract System.IObservable GetValidationChangeObservable(); + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isValidFunc, System.Func message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isValidFunc, System.Func messageFunc) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isValidFunc, string message) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public abstract class ObservableValidationBase : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + { + protected ObservableValidationBase(System.IObservable observable) { } + protected ObservableValidationBase(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public bool IsValid { get; } + public System.Collections.Generic.IEnumerable Properties { get; } + public int PropertyCount { get; } + public ReactiveUI.Validation.Collections.ValidationText? Text { get; } + public System.IObservable ValidationStatusChange { get; } + protected void AddProperty(System.Linq.Expressions.Expression> property) { } + public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } + public void Dispose() { } + protected virtual void Dispose(bool disposing) { } + } + public sealed class ObservableValidation : ReactiveUI.Validation.Components.ObservableValidationBase + { + public ObservableValidation(System.IObservable observable) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, string message) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, string message) { } + } + public sealed class ObservableValidation : ReactiveUI.Validation.Components.ObservableValidationBase + { + public ObservableValidation(System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, string message) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, string message) { } + } +} +namespace ReactiveUI.Validation.Contexts +{ + public class ValidationContext : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + { + public ValidationContext(System.Reactive.Concurrency.IScheduler? scheduler = null) { } + public bool IsValid { get; } + public ReactiveUI.Validation.Collections.ValidationText Text { get; } + public System.IObservable Valid { get; } + public System.IObservable ValidationStatusChange { get; } + public System.Collections.ObjectModel.ReadOnlyObservableCollection Validations { get; } + public void Add(ReactiveUI.Validation.Components.Abstractions.IValidationComponent validation) { } + public void Dispose() { } + protected virtual void Dispose(bool disposing) { } + public bool GetIsValid() { } + public void Remove(ReactiveUI.Validation.Components.Abstractions.IValidationComponent validation) { } + public void RemoveMany(System.Collections.Generic.IEnumerable validations) { } + } +} +namespace ReactiveUI.Validation.Extensions +{ + public static class ValidatableViewModelExtensions + { + public static void ClearValidationRules(this TViewModel viewModel) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static void ClearValidationRules(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static System.IObservable IsValid(this TViewModel viewModel) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable, string message) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel + where TValue : ReactiveUI.Validation.States.IValidationState { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable validationObservable) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable, System.Func isValidFunc, System.Func messageFunc) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isPropertyValid, System.Func message) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isPropertyValid, string message) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable viewModelObservable, string message) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable validationObservable) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel + where TValue : ReactiveUI.Validation.States.IValidationState { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable viewModelObservable, System.Func isValidFunc, System.Func messageFunc) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + } + public static class ValidatesPropertiesExtensions + { + public static bool ContainsProperty(this ReactiveUI.Validation.Components.Abstractions.IValidatesProperties validatesProperties, System.Linq.Expressions.Expression> propertyExpression, bool exclusively = false) { } + } + public static class ValidationContextExtensions + { + public static System.IObservable> ObserveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty, bool strict = true) { } + } + public static class ViewForExtensions + { + public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewModelHelperProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + } +} +namespace ReactiveUI.Validation.Formatters.Abstractions +{ + public interface IValidationTextFormatter + { + TOut Format(ReactiveUI.Validation.Collections.ValidationText validationText); + } +} +namespace ReactiveUI.Validation.Formatters +{ + public class SingleLineFormatter : ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter + { + public SingleLineFormatter(string? separator = null) { } + public static ReactiveUI.Validation.Formatters.SingleLineFormatter Default { get; } + public string Format(ReactiveUI.Validation.Collections.ValidationText validationText) { } + } +} +namespace ReactiveUI.Validation.Helpers +{ + public abstract class ReactiveValidationObject : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel, System.ComponentModel.INotifyDataErrorInfo + { + protected ReactiveValidationObject(System.Reactive.Concurrency.IScheduler? scheduler = null, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) { } + public bool HasErrors { get; } + public ReactiveUI.Validation.Contexts.ValidationContext ValidationContext { get; } + public event System.EventHandler? ErrorsChanged; + public virtual System.Collections.IEnumerable GetErrors(string propertyName) { } + protected void RaiseErrorsChanged(string propertyName = "") { } + } + public class ValidationHelper : ReactiveUI.ReactiveObject, System.IDisposable + { + public ValidationHelper(ReactiveUI.Validation.Components.Abstractions.IValidationComponent validation, System.IDisposable? cleanup = null) { } + public bool IsValid { get; } + public ReactiveUI.Validation.Collections.ValidationText? Message { get; } + public System.IObservable ValidationChanged { get; } + public void Dispose() { } + protected virtual void Dispose(bool disposing) { } + } +} +namespace ReactiveUI.Validation.States +{ + public interface IValidationState + { + bool IsValid { get; } + ReactiveUI.Validation.Collections.ValidationText Text { get; } + } + public class ValidationState : ReactiveUI.Validation.States.IValidationState + { + public static readonly ReactiveUI.Validation.States.ValidationState Valid; + public ValidationState(bool isValid, ReactiveUI.Validation.Collections.ValidationText text) { } + public ValidationState(bool isValid, string text) { } + public bool IsValid { get; } + public ReactiveUI.Validation.Collections.ValidationText Text { get; } + } +} +namespace ReactiveUI.Validation.TemplateGenerators +{ + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Linq.Expressions.Expression> property6, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Linq.Expressions.Expression> property6, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Linq.Expressions.Expression> property6, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } +} +namespace ReactiveUI.Validation.ValidationBindings.Abstractions +{ + public interface IValidationBinding : System.IDisposable { } +} +namespace ReactiveUI.Validation.ValidationBindings +{ + public sealed class ValidationBinding : ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding, System.IDisposable + { + public void Dispose() { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForProperty(TView view, System.Linq.Expressions.Expression> viewModelProperty, System.Action, System.Collections.Generic.IList> action, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter formatter, bool strict = true) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForProperty(TView view, System.Linq.Expressions.Expression> viewModelProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null, bool strict = true) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForValidationHelperProperty(TView view, System.Linq.Expressions.Expression> viewModelHelperProperty, System.Action action, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter formatter) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForValidationHelperProperty(TView view, System.Linq.Expressions.Expression> viewModelHelperProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForViewModel(TView view, System.Action action, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter formatter) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForViewModel(TView view, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + } +} \ No newline at end of file diff --git a/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net472.approved.txt b/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net472.approved.txt index 9c7c60dd..596d22f2 100644 --- a/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net472.approved.txt +++ b/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net472.approved.txt @@ -1,4 +1,5 @@ -[assembly: System.Runtime.Versioning.TargetFramework(".NETFramework,Version=v4.6.1", FrameworkDisplayName=".NET Framework 4.6.1")] +[assembly: System.Reflection.AssemblyMetadata("RepositoryUrl", "https://github.com/reactiveui/reactiveui.validation")] +[assembly: System.Runtime.Versioning.TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName=".NET Framework 4.7.2")] namespace ReactiveUI.Validation.Abstractions { public interface IValidatableViewModel @@ -12,28 +13,8 @@ namespace ReactiveUI.Validation.Collections { public static readonly ReactiveUI.Validation.Collections.ValidationText Empty; public static readonly ReactiveUI.Validation.Collections.ValidationText None; - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Calling the constructor is deprecated, please use ValidationText.Create() overloa" + - "d instead.")] - public ValidationText() { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Calling the constructor is deprecated, please use ValidationText.Create(IEnumerab" + - "le) overload instead.")] - public ValidationText(System.Collections.Generic.IEnumerable validationTexts) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Calling the constructor is deprecated, please use ValidationText.Create(string) o" + - "verload instead.")] - public ValidationText(string text) { } public int Count { get; } public string this[int index] { get; } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("ValidationText will be made immutable in future versions, please do not use the A" + - "dd(string) method.")] - public void Add(string text) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("ValidationText will be made immutable in future versions, please do not use the C" + - "lear() method.")] - public void Clear() { } public System.Collections.Generic.IEnumerator GetEnumerator() { } public string ToSingleLine(string? separator = ",") { } public static ReactiveUI.Validation.Collections.ValidationText Create(System.Collections.Generic.IEnumerable validationTexts) { } @@ -53,21 +34,12 @@ namespace ReactiveUI.Validation.Comparators namespace ReactiveUI.Validation.Components.Abstractions { public interface IPropertyValidationComponent : ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent { } - [System.Obsolete("Consider using the non-generic version of an IPropertyValidationComponent.")] - public interface IPropertyValidationComponent : ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent { } public interface IValidatesProperties { System.Collections.Generic.IEnumerable Properties { get; } int PropertyCount { get; } bool ContainsPropertyName(string propertyName, bool exclusively = false); } - [System.Obsolete("Consider using the non-generic version of an IValidatesProperties.")] - public interface IValidatesProperties : ReactiveUI.Validation.Components.Abstractions.IValidatesProperties - { - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using the non-generic version of an IValidatesProperties.")] - bool ContainsProperty(System.Linq.Expressions.Expression> propertyExpression, bool exclusively = false); - } public interface IValidationComponent { bool IsValid { get; } @@ -77,7 +49,7 @@ namespace ReactiveUI.Validation.Components.Abstractions } namespace ReactiveUI.Validation.Components { - public abstract class BasePropertyValidation : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + public abstract class BasePropertyValidation : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable { protected BasePropertyValidation() { } public bool IsValid { get; } @@ -86,10 +58,6 @@ namespace ReactiveUI.Validation.Components public ReactiveUI.Validation.Collections.ValidationText? Text { get; } public System.IObservable ValidationStatusChange { get; } protected void AddProperty(System.Linq.Expressions.Expression> property) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using the non-generic ContainsProperty of a non-generic IPropertyValidat" + - "ionComponent.")] - public bool ContainsProperty(System.Linq.Expressions.Expression> property, bool exclusively = false) { } public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } public void Dispose() { } protected virtual void Dispose(bool disposing) { } @@ -103,42 +71,7 @@ namespace ReactiveUI.Validation.Components protected override void Dispose(bool disposing) { } protected override System.IObservable GetValidationChangeObservable() { } } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using ObservableValidation instead.")] - public abstract class ModelObservableValidationBase : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable - { - protected ModelObservableValidationBase(TViewModel viewModel, System.Func> validityObservable, System.Func messageFunc) { } - public bool IsValid { get; } - public System.Collections.Generic.IEnumerable Properties { get; } - public int PropertyCount { get; } - public ReactiveUI.Validation.Collections.ValidationText? Text { get; } - public System.IObservable ValidationStatusChange { get; } - protected void AddProperty(System.Linq.Expressions.Expression> property) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using the non-generic ContainsProperty of a non-generic IPropertyValidat" + - "ionComponent.")] - public bool ContainsProperty(System.Linq.Expressions.Expression> property, bool exclusively = false) { } - public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } - public void Dispose() { } - protected virtual void Dispose(bool disposing) { } - } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using ObservableValidation instead.")] - public class ModelObservableValidation : ReactiveUI.Validation.Components.ModelObservableValidationBase - { - public ModelObservableValidation(TViewModel viewModel, System.Func> validityObservable, System.Func message) { } - public ModelObservableValidation(TViewModel viewModel, System.Func> validityObservable, System.Func messageFunc) { } - public ModelObservableValidation(TViewModel viewModel, System.Func> validityObservable, string message) { } - } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using ObservableValidation instead.")] - public class ModelObservableValidation : ReactiveUI.Validation.Components.ModelObservableValidationBase - { - public ModelObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> validityObservable, System.Func message) { } - public ModelObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> validityObservable, System.Func messageFunc) { } - public ModelObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> validityObservable, string message) { } - } - public abstract class ObservableValidationBase : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + public abstract class ObservableValidationBase : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable { protected ObservableValidationBase(System.IObservable observable) { } protected ObservableValidationBase(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } @@ -148,10 +81,6 @@ namespace ReactiveUI.Validation.Components public ReactiveUI.Validation.Collections.ValidationText? Text { get; } public System.IObservable ValidationStatusChange { get; } protected void AddProperty(System.Linq.Expressions.Expression> property) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using the non-generic ContainsProperty of a non-generic IPropertyValidat" + - "ionComponent.")] - public bool ContainsProperty(System.Linq.Expressions.Expression> property, bool exclusively = false) { } public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } public void Dispose() { } protected virtual void Dispose(bool disposing) { } @@ -205,22 +134,6 @@ namespace ReactiveUI.Validation.Extensions where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable) where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Func> viewModelObservableProperty, System.Func messageFunc) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This overload is planned for future removal. Consider using either the overload t" + - "hat accepts a Func as the messageFunc parameter, or the over" + - "load that accepts a string.")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Func> viewModelObservableProperty, System.Func messageFunc) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Func> viewModelObservableProperty, string message) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable, string message) where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable) @@ -230,22 +143,6 @@ namespace ReactiveUI.Validation.Extensions where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable, System.Func isValidFunc, System.Func messageFunc) where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> viewModelObservableProperty, System.Func messageFunc) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This overload is planned for future removal. Consider using either the overload t" + - "hat accepts a Func as the messageFunc parameter, or the over" + - "load that accepts a string.")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> viewModelObservableProperty, System.Func messageFunc) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> viewModelObservableProperty, string message) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isPropertyValid, System.Func message) where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isPropertyValid, string message) @@ -265,25 +162,9 @@ namespace ReactiveUI.Validation.Extensions public static class ValidationContextExtensions { public static System.IObservable> ObserveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty, bool strict = true) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Since we support adding and removing validation rules dynamically, consider using" + - " either the ObserveFor extension method, or BindValidation.")] - public static System.Collections.Generic.IEnumerable> ResolveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty, bool strict = true) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Since we support adding and removing validation rules dynamically, consider using" + - " either the ObserveFor extension method, or BindValidation.")] - public static System.Collections.Generic.IEnumerable> ResolveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty1, System.Linq.Expressions.Expression> viewModelProperty2) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Since we support adding and removing validation rules dynamically, consider using" + - " either the ObserveFor extension method, or BindValidation.")] - public static System.Collections.Generic.IEnumerable> ResolveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty1, System.Linq.Expressions.Expression> viewModelProperty2, System.Linq.Expressions.Expression> viewModelProperty3) { } } public static class ViewForExtensions { - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This method is a part of ReactiveUI internals and will be removed from ReactiveUI" + - ".Validation public API soon.")] - public static System.IDisposable BindToDirect(System.IObservable @this, TTarget target, System.Linq.Expressions.Expression viewExpression) { } public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) where TView : ReactiveUI.IViewFor where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } @@ -293,12 +174,6 @@ namespace ReactiveUI.Validation.Extensions public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) where TView : ReactiveUI.IViewFor where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This method is no longer required, BindValidation now supports multiple validatio" + - "ns.")] - public static System.IDisposable BindValidationEx(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) - where TView : ReactiveUI.IViewFor - where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } } } namespace ReactiveUI.Validation.Formatters.Abstractions @@ -328,13 +203,6 @@ namespace ReactiveUI.Validation.Helpers public virtual System.Collections.IEnumerable GetErrors(string propertyName) { } protected void RaiseErrorsChanged(string propertyName = "") { } } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("The type parameters are no longer required. Use the non-generic version of Reacti" + - "veValidationObject.")] - public abstract class ReactiveValidationObject : ReactiveUI.Validation.Helpers.ReactiveValidationObject - { - protected ReactiveValidationObject(System.Reactive.Concurrency.IScheduler? scheduler = null, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) { } - } public class ValidationHelper : ReactiveUI.ReactiveObject, System.IDisposable { public ValidationHelper(ReactiveUI.Validation.Components.Abstractions.IValidationComponent validation, System.IDisposable? cleanup = null) { } @@ -357,15 +225,6 @@ namespace ReactiveUI.Validation.States public static readonly ReactiveUI.Validation.States.ValidationState Valid; public ValidationState(bool isValid, ReactiveUI.Validation.Collections.ValidationText text) { } public ValidationState(bool isValid, string text) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This constructor overload is going to be removed soon.")] - public ValidationState(bool isValid, ReactiveUI.Validation.Collections.ValidationText text, ReactiveUI.Validation.Components.Abstractions.IValidationComponent component) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This constructor overload is going to be removed soon.")] - public ValidationState(bool isValid, string text, ReactiveUI.Validation.Components.Abstractions.IValidationComponent component) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This property will be removed soon.")] - public ReactiveUI.Validation.Components.Abstractions.IValidationComponent? Component { get; } public bool IsValid { get; } public ReactiveUI.Validation.Collections.ValidationText Text { get; } } diff --git a/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net5.0.approved.txt b/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net5.0.approved.txt new file mode 100644 index 00000000..803c839c --- /dev/null +++ b/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.net5.0.approved.txt @@ -0,0 +1,303 @@ +[assembly: System.Reflection.AssemblyMetadata("RepositoryUrl", "https://github.com/reactiveui/reactiveui.validation")] +[assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v5.0", FrameworkDisplayName="")] +namespace ReactiveUI.Validation.Abstractions +{ + public interface IValidatableViewModel + { + ReactiveUI.Validation.Contexts.ValidationContext ValidationContext { get; } + } +} +namespace ReactiveUI.Validation.Collections +{ + public class ValidationText : System.Collections.Generic.IEnumerable, System.Collections.IEnumerable + { + public static readonly ReactiveUI.Validation.Collections.ValidationText Empty; + public static readonly ReactiveUI.Validation.Collections.ValidationText None; + public int Count { get; } + public string this[int index] { get; } + public System.Collections.Generic.IEnumerator GetEnumerator() { } + public string ToSingleLine(string? separator = ",") { } + public static ReactiveUI.Validation.Collections.ValidationText Create(System.Collections.Generic.IEnumerable validationTexts) { } + public static ReactiveUI.Validation.Collections.ValidationText Create(System.Collections.Generic.IEnumerable validationTexts) { } + public static ReactiveUI.Validation.Collections.ValidationText Create(params string[] validationTexts) { } + } +} +namespace ReactiveUI.Validation.Comparators +{ + public class ValidationStateComparer : System.Collections.Generic.EqualityComparer + { + public ValidationStateComparer() { } + public override bool Equals(ReactiveUI.Validation.States.IValidationState x, ReactiveUI.Validation.States.IValidationState y) { } + public override int GetHashCode(ReactiveUI.Validation.States.IValidationState obj) { } + } +} +namespace ReactiveUI.Validation.Components.Abstractions +{ + public interface IPropertyValidationComponent : ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent { } + public interface IValidatesProperties + { + System.Collections.Generic.IEnumerable Properties { get; } + int PropertyCount { get; } + bool ContainsPropertyName(string propertyName, bool exclusively = false); + } + public interface IValidationComponent + { + bool IsValid { get; } + ReactiveUI.Validation.Collections.ValidationText? Text { get; } + System.IObservable ValidationStatusChange { get; } + } +} +namespace ReactiveUI.Validation.Components +{ + public abstract class BasePropertyValidation : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + { + protected BasePropertyValidation() { } + public bool IsValid { get; } + public System.Collections.Generic.IEnumerable Properties { get; } + public int PropertyCount { get; } + public ReactiveUI.Validation.Collections.ValidationText? Text { get; } + public System.IObservable ValidationStatusChange { get; } + protected void AddProperty(System.Linq.Expressions.Expression> property) { } + public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } + public void Dispose() { } + protected virtual void Dispose(bool disposing) { } + protected abstract System.IObservable GetValidationChangeObservable(); + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isValidFunc, System.Func message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isValidFunc, System.Func messageFunc) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isValidFunc, string message) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public abstract class ObservableValidationBase : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + { + protected ObservableValidationBase(System.IObservable observable) { } + protected ObservableValidationBase(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public bool IsValid { get; } + public System.Collections.Generic.IEnumerable Properties { get; } + public int PropertyCount { get; } + public ReactiveUI.Validation.Collections.ValidationText? Text { get; } + public System.IObservable ValidationStatusChange { get; } + protected void AddProperty(System.Linq.Expressions.Expression> property) { } + public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } + public void Dispose() { } + protected virtual void Dispose(bool disposing) { } + } + public sealed class ObservableValidation : ReactiveUI.Validation.Components.ObservableValidationBase + { + public ObservableValidation(System.IObservable observable) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, string message) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, string message) { } + } + public sealed class ObservableValidation : ReactiveUI.Validation.Components.ObservableValidationBase + { + public ObservableValidation(System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, string message) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } + public ObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable observable, System.Func isValidFunc, string message) { } + } +} +namespace ReactiveUI.Validation.Contexts +{ + public class ValidationContext : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + { + public ValidationContext(System.Reactive.Concurrency.IScheduler? scheduler = null) { } + public bool IsValid { get; } + public ReactiveUI.Validation.Collections.ValidationText Text { get; } + public System.IObservable Valid { get; } + public System.IObservable ValidationStatusChange { get; } + public System.Collections.ObjectModel.ReadOnlyObservableCollection Validations { get; } + public void Add(ReactiveUI.Validation.Components.Abstractions.IValidationComponent validation) { } + public void Dispose() { } + protected virtual void Dispose(bool disposing) { } + public bool GetIsValid() { } + public void Remove(ReactiveUI.Validation.Components.Abstractions.IValidationComponent validation) { } + public void RemoveMany(System.Collections.Generic.IEnumerable validations) { } + } +} +namespace ReactiveUI.Validation.Extensions +{ + public static class ValidatableViewModelExtensions + { + public static void ClearValidationRules(this TViewModel viewModel) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static void ClearValidationRules(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static System.IObservable IsValid(this TViewModel viewModel) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable, string message) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel + where TValue : ReactiveUI.Validation.States.IValidationState { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable validationObservable) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable, System.Func isValidFunc, System.Func messageFunc) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isPropertyValid, System.Func message) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isPropertyValid, string message) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable viewModelObservable, string message) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable validationObservable) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel + where TValue : ReactiveUI.Validation.States.IValidationState { } + public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.IObservable viewModelObservable, System.Func isValidFunc, System.Func messageFunc) + where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + } + public static class ValidatesPropertiesExtensions + { + public static bool ContainsProperty(this ReactiveUI.Validation.Components.Abstractions.IValidatesProperties validatesProperties, System.Linq.Expressions.Expression> propertyExpression, bool exclusively = false) { } + } + public static class ValidationContextExtensions + { + public static System.IObservable> ObserveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty, bool strict = true) { } + } + public static class ViewForExtensions + { + public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewModelHelperProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + } +} +namespace ReactiveUI.Validation.Formatters.Abstractions +{ + public interface IValidationTextFormatter + { + TOut Format(ReactiveUI.Validation.Collections.ValidationText validationText); + } +} +namespace ReactiveUI.Validation.Formatters +{ + public class SingleLineFormatter : ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter + { + public SingleLineFormatter(string? separator = null) { } + public static ReactiveUI.Validation.Formatters.SingleLineFormatter Default { get; } + public string Format(ReactiveUI.Validation.Collections.ValidationText validationText) { } + } +} +namespace ReactiveUI.Validation.Helpers +{ + public abstract class ReactiveValidationObject : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel, System.ComponentModel.INotifyDataErrorInfo + { + protected ReactiveValidationObject(System.Reactive.Concurrency.IScheduler? scheduler = null, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) { } + public bool HasErrors { get; } + public ReactiveUI.Validation.Contexts.ValidationContext ValidationContext { get; } + public event System.EventHandler? ErrorsChanged; + public virtual System.Collections.IEnumerable GetErrors(string propertyName) { } + protected void RaiseErrorsChanged(string propertyName = "") { } + } + public class ValidationHelper : ReactiveUI.ReactiveObject, System.IDisposable + { + public ValidationHelper(ReactiveUI.Validation.Components.Abstractions.IValidationComponent validation, System.IDisposable? cleanup = null) { } + public bool IsValid { get; } + public ReactiveUI.Validation.Collections.ValidationText? Message { get; } + public System.IObservable ValidationChanged { get; } + public void Dispose() { } + protected virtual void Dispose(bool disposing) { } + } +} +namespace ReactiveUI.Validation.States +{ + public interface IValidationState + { + bool IsValid { get; } + ReactiveUI.Validation.Collections.ValidationText Text { get; } + } + public class ValidationState : ReactiveUI.Validation.States.IValidationState + { + public static readonly ReactiveUI.Validation.States.ValidationState Valid; + public ValidationState(bool isValid, ReactiveUI.Validation.Collections.ValidationText text) { } + public ValidationState(bool isValid, string text) { } + public bool IsValid { get; } + public ReactiveUI.Validation.Collections.ValidationText Text { get; } + } +} +namespace ReactiveUI.Validation.TemplateGenerators +{ + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } + public sealed class BasePropertyValidation : ReactiveUI.Validation.Components.BasePropertyValidation + { + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Linq.Expressions.Expression> property6, System.Func, bool> isValidFunc, System.Func, string> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Linq.Expressions.Expression> property6, System.Func, bool> isValidFunc, System.Func, bool, ReactiveUI.Validation.Collections.ValidationText> message) { } + public BasePropertyValidation(TViewModel viewModel, System.Linq.Expressions.Expression> property1, System.Linq.Expressions.Expression> property2, System.Linq.Expressions.Expression> property3, System.Linq.Expressions.Expression> property4, System.Linq.Expressions.Expression> property5, System.Linq.Expressions.Expression> property6, System.Func, bool> isValidFunc, System.Func, bool, string> messageFunc) { } + protected override void Dispose(bool disposing) { } + protected override System.IObservable GetValidationChangeObservable() { } + } +} +namespace ReactiveUI.Validation.ValidationBindings.Abstractions +{ + public interface IValidationBinding : System.IDisposable { } +} +namespace ReactiveUI.Validation.ValidationBindings +{ + public sealed class ValidationBinding : ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding, System.IDisposable + { + public void Dispose() { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForProperty(TView view, System.Linq.Expressions.Expression> viewModelProperty, System.Action, System.Collections.Generic.IList> action, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter formatter, bool strict = true) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForProperty(TView view, System.Linq.Expressions.Expression> viewModelProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null, bool strict = true) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForValidationHelperProperty(TView view, System.Linq.Expressions.Expression> viewModelHelperProperty, System.Action action, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter formatter) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForValidationHelperProperty(TView view, System.Linq.Expressions.Expression> viewModelHelperProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForViewModel(TView view, System.Action action, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter formatter) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + public static ReactiveUI.Validation.ValidationBindings.Abstractions.IValidationBinding ForViewModel(TView view, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) + where TView : ReactiveUI.IViewFor + where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } + } +} \ No newline at end of file diff --git a/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.netcoreapp3.1.approved.txt b/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.netcoreapp3.1.approved.txt index edc3fe28..aa873e30 100644 --- a/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.netcoreapp3.1.approved.txt +++ b/src/ReactiveUI.Validation.Tests/API/ApiApprovalTests.ValidationProject.netcoreapp3.1.approved.txt @@ -1,3 +1,4 @@ +[assembly: System.Reflection.AssemblyMetadata("RepositoryUrl", "https://github.com/reactiveui/reactiveui.validation")] [assembly: System.Runtime.Versioning.TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName="")] namespace ReactiveUI.Validation.Abstractions { @@ -12,28 +13,8 @@ namespace ReactiveUI.Validation.Collections { public static readonly ReactiveUI.Validation.Collections.ValidationText Empty; public static readonly ReactiveUI.Validation.Collections.ValidationText None; - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Calling the constructor is deprecated, please use ValidationText.Create() overloa" + - "d instead.")] - public ValidationText() { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Calling the constructor is deprecated, please use ValidationText.Create(IEnumerab" + - "le) overload instead.")] - public ValidationText(System.Collections.Generic.IEnumerable validationTexts) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Calling the constructor is deprecated, please use ValidationText.Create(string) o" + - "verload instead.")] - public ValidationText(string text) { } public int Count { get; } public string this[int index] { get; } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("ValidationText will be made immutable in future versions, please do not use the A" + - "dd(string) method.")] - public void Add(string text) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("ValidationText will be made immutable in future versions, please do not use the C" + - "lear() method.")] - public void Clear() { } public System.Collections.Generic.IEnumerator GetEnumerator() { } public string ToSingleLine(string? separator = ",") { } public static ReactiveUI.Validation.Collections.ValidationText Create(System.Collections.Generic.IEnumerable validationTexts) { } @@ -53,21 +34,12 @@ namespace ReactiveUI.Validation.Comparators namespace ReactiveUI.Validation.Components.Abstractions { public interface IPropertyValidationComponent : ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent { } - [System.Obsolete("Consider using the non-generic version of an IPropertyValidationComponent.")] - public interface IPropertyValidationComponent : ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent { } public interface IValidatesProperties { System.Collections.Generic.IEnumerable Properties { get; } int PropertyCount { get; } bool ContainsPropertyName(string propertyName, bool exclusively = false); } - [System.Obsolete("Consider using the non-generic version of an IValidatesProperties.")] - public interface IValidatesProperties : ReactiveUI.Validation.Components.Abstractions.IValidatesProperties - { - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using the non-generic version of an IValidatesProperties.")] - bool ContainsProperty(System.Linq.Expressions.Expression> propertyExpression, bool exclusively = false); - } public interface IValidationComponent { bool IsValid { get; } @@ -77,7 +49,7 @@ namespace ReactiveUI.Validation.Components.Abstractions } namespace ReactiveUI.Validation.Components { - public abstract class BasePropertyValidation : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + public abstract class BasePropertyValidation : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable { protected BasePropertyValidation() { } public bool IsValid { get; } @@ -86,10 +58,6 @@ namespace ReactiveUI.Validation.Components public ReactiveUI.Validation.Collections.ValidationText? Text { get; } public System.IObservable ValidationStatusChange { get; } protected void AddProperty(System.Linq.Expressions.Expression> property) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using the non-generic ContainsProperty of a non-generic IPropertyValidat" + - "ionComponent.")] - public bool ContainsProperty(System.Linq.Expressions.Expression> property, bool exclusively = false) { } public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } public void Dispose() { } protected virtual void Dispose(bool disposing) { } @@ -103,42 +71,7 @@ namespace ReactiveUI.Validation.Components protected override void Dispose(bool disposing) { } protected override System.IObservable GetValidationChangeObservable() { } } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using ObservableValidation instead.")] - public abstract class ModelObservableValidationBase : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable - { - protected ModelObservableValidationBase(TViewModel viewModel, System.Func> validityObservable, System.Func messageFunc) { } - public bool IsValid { get; } - public System.Collections.Generic.IEnumerable Properties { get; } - public int PropertyCount { get; } - public ReactiveUI.Validation.Collections.ValidationText? Text { get; } - public System.IObservable ValidationStatusChange { get; } - protected void AddProperty(System.Linq.Expressions.Expression> property) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using the non-generic ContainsProperty of a non-generic IPropertyValidat" + - "ionComponent.")] - public bool ContainsProperty(System.Linq.Expressions.Expression> property, bool exclusively = false) { } - public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } - public void Dispose() { } - protected virtual void Dispose(bool disposing) { } - } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using ObservableValidation instead.")] - public class ModelObservableValidation : ReactiveUI.Validation.Components.ModelObservableValidationBase - { - public ModelObservableValidation(TViewModel viewModel, System.Func> validityObservable, System.Func message) { } - public ModelObservableValidation(TViewModel viewModel, System.Func> validityObservable, System.Func messageFunc) { } - public ModelObservableValidation(TViewModel viewModel, System.Func> validityObservable, string message) { } - } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using ObservableValidation instead.")] - public class ModelObservableValidation : ReactiveUI.Validation.Components.ModelObservableValidationBase - { - public ModelObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> validityObservable, System.Func message) { } - public ModelObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> validityObservable, System.Func messageFunc) { } - public ModelObservableValidation(TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> validityObservable, string message) { } - } - public abstract class ObservableValidationBase : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable + public abstract class ObservableValidationBase : ReactiveUI.ReactiveObject, ReactiveUI.Validation.Components.Abstractions.IPropertyValidationComponent, ReactiveUI.Validation.Components.Abstractions.IValidatesProperties, ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.IDisposable { protected ObservableValidationBase(System.IObservable observable) { } protected ObservableValidationBase(TViewModel viewModel, System.IObservable observable, System.Func isValidFunc, System.Func messageFunc) { } @@ -148,10 +81,6 @@ namespace ReactiveUI.Validation.Components public ReactiveUI.Validation.Collections.ValidationText? Text { get; } public System.IObservable ValidationStatusChange { get; } protected void AddProperty(System.Linq.Expressions.Expression> property) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Consider using the non-generic ContainsProperty of a non-generic IPropertyValidat" + - "ionComponent.")] - public bool ContainsProperty(System.Linq.Expressions.Expression> property, bool exclusively = false) { } public bool ContainsPropertyName(string propertyName, bool exclusively = false) { } public void Dispose() { } protected virtual void Dispose(bool disposing) { } @@ -205,22 +134,6 @@ namespace ReactiveUI.Validation.Extensions where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable) where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Func> viewModelObservableProperty, System.Func messageFunc) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This overload is planned for future removal. Consider using either the overload t" + - "hat accepts a Func as the messageFunc parameter, or the over" + - "load that accepts a string.")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Func> viewModelObservableProperty, System.Func messageFunc) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Func> viewModelObservableProperty, string message) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable, string message) where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable) @@ -230,22 +143,6 @@ namespace ReactiveUI.Validation.Extensions where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.IObservable validationObservable, System.Func isValidFunc, System.Func messageFunc) where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> viewModelObservableProperty, System.Func messageFunc) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This overload is planned for future removal. Consider using either the overload t" + - "hat accepts a Func as the messageFunc parameter, or the over" + - "load that accepts a string.")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> viewModelObservableProperty, System.Func messageFunc) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func> viewModelObservableProperty, string message) - where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isPropertyValid, System.Func message) where TViewModel : ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } public static ReactiveUI.Validation.Helpers.ValidationHelper ValidationRule(this TViewModel viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Func isPropertyValid, string message) @@ -265,25 +162,9 @@ namespace ReactiveUI.Validation.Extensions public static class ValidationContextExtensions { public static System.IObservable> ObserveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty, bool strict = true) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Since we support adding and removing validation rules dynamically, consider using" + - " either the ObserveFor extension method, or BindValidation.")] - public static System.Collections.Generic.IEnumerable> ResolveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty, bool strict = true) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Since we support adding and removing validation rules dynamically, consider using" + - " either the ObserveFor extension method, or BindValidation.")] - public static System.Collections.Generic.IEnumerable> ResolveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty1, System.Linq.Expressions.Expression> viewModelProperty2) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("Since we support adding and removing validation rules dynamically, consider using" + - " either the ObserveFor extension method, or BindValidation.")] - public static System.Collections.Generic.IEnumerable> ResolveFor(this ReactiveUI.Validation.Contexts.ValidationContext context, System.Linq.Expressions.Expression> viewModelProperty1, System.Linq.Expressions.Expression> viewModelProperty2, System.Linq.Expressions.Expression> viewModelProperty3) { } } public static class ViewForExtensions { - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This method is a part of ReactiveUI internals and will be removed from ReactiveUI" + - ".Validation public API soon.")] - public static System.IDisposable BindToDirect(System.IObservable @this, TTarget target, System.Linq.Expressions.Expression viewExpression) { } public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) where TView : ReactiveUI.IViewFor where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } @@ -293,12 +174,6 @@ namespace ReactiveUI.Validation.Extensions public static System.IDisposable BindValidation(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) where TView : ReactiveUI.IViewFor where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This method is no longer required, BindValidation now supports multiple validatio" + - "ns.")] - public static System.IDisposable BindValidationEx(this TView view, TViewModel? viewModel, System.Linq.Expressions.Expression> viewModelProperty, System.Linq.Expressions.Expression> viewProperty, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) - where TView : ReactiveUI.IViewFor - where TViewModel : class, ReactiveUI.IReactiveObject, ReactiveUI.Validation.Abstractions.IValidatableViewModel { } } } namespace ReactiveUI.Validation.Formatters.Abstractions @@ -328,13 +203,6 @@ namespace ReactiveUI.Validation.Helpers public virtual System.Collections.IEnumerable GetErrors(string propertyName) { } protected void RaiseErrorsChanged(string propertyName = "") { } } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("The type parameters are no longer required. Use the non-generic version of Reacti" + - "veValidationObject.")] - public abstract class ReactiveValidationObject : ReactiveUI.Validation.Helpers.ReactiveValidationObject - { - protected ReactiveValidationObject(System.Reactive.Concurrency.IScheduler? scheduler = null, ReactiveUI.Validation.Formatters.Abstractions.IValidationTextFormatter? formatter = null) { } - } public class ValidationHelper : ReactiveUI.ReactiveObject, System.IDisposable { public ValidationHelper(ReactiveUI.Validation.Components.Abstractions.IValidationComponent validation, System.IDisposable? cleanup = null) { } @@ -357,15 +225,6 @@ namespace ReactiveUI.Validation.States public static readonly ReactiveUI.Validation.States.ValidationState Valid; public ValidationState(bool isValid, ReactiveUI.Validation.Collections.ValidationText text) { } public ValidationState(bool isValid, string text) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This constructor overload is going to be removed soon.")] - public ValidationState(bool isValid, ReactiveUI.Validation.Collections.ValidationText text, ReactiveUI.Validation.Components.Abstractions.IValidationComponent component) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This constructor overload is going to be removed soon.")] - public ValidationState(bool isValid, string text, ReactiveUI.Validation.Components.Abstractions.IValidationComponent component) { } - [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] - [System.Obsolete("This property will be removed soon.")] - public ReactiveUI.Validation.Components.Abstractions.IValidationComponent? Component { get; } public bool IsValid { get; } public ReactiveUI.Validation.Collections.ValidationText Text { get; } } diff --git a/src/ReactiveUI.Validation.Tests/ReactiveUI.Validation.Tests.csproj b/src/ReactiveUI.Validation.Tests/ReactiveUI.Validation.Tests.csproj index 3277cd19..e3819cf1 100644 --- a/src/ReactiveUI.Validation.Tests/ReactiveUI.Validation.Tests.csproj +++ b/src/ReactiveUI.Validation.Tests/ReactiveUI.Validation.Tests.csproj @@ -1,8 +1,8 @@  - netcoreapp3.1 - $(TargetFrameworks);net472 + netcoreapp3.1;net5.0 + $(TargetFrameworks);net472;net461 $(NoWarn);1591;CA1707;SA1633 latest diff --git a/src/ReactiveUI.Validation/Collections/ValidationText.cs b/src/ReactiveUI.Validation/Collections/ValidationText.cs index 7e80221b..3bbde55a 100755 --- a/src/ReactiveUI.Validation/Collections/ValidationText.cs +++ b/src/ReactiveUI.Validation/Collections/ValidationText.cs @@ -6,7 +6,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Linq; namespace ReactiveUI.Validation.Collections @@ -26,56 +25,7 @@ public class ValidationText : IEnumerable /// public static readonly ValidationText Empty = new ValidationText(new[] { string.Empty }); - private /* readonly */ string[] _texts; - - /// - /// Initializes a new instance of the class. - /// - [ExcludeFromCodeCoverage] - [Obsolete("Calling the constructor is deprecated, please use ValidationText.Create() overload instead.")] - public ValidationText() - { - _texts = Array.Empty(); - } - - /// - /// Initializes a new instance of the class. - /// - /// Text to be added in the collection. - [ExcludeFromCodeCoverage] - [Obsolete("Calling the constructor is deprecated, please use ValidationText.Create(string) overload instead.")] - public ValidationText(string text) - { - _texts = text is null - ? None._texts - : text.Length < 1 - ? Empty._texts - : new[] { text }; - } - - /// - /// Initializes a new instance of the class. - /// - /// collection to be added into the text collection. - [ExcludeFromCodeCoverage] - [Obsolete("Calling the constructor is deprecated, please use ValidationText.Create(IEnumerable) overload instead.")] - public ValidationText(IEnumerable validationTexts) - { - // Note _texts are already validated as not-null - _texts = (validationTexts ?? Array.Empty()) - .SelectMany(vt => vt._texts) - .ToArray(); - - // Re-use arrays when possible - if (_texts.Length < 1) - { - _texts = Array.Empty(); - } - else if (_texts.Length == 1 && _texts[0].Length < 1) - { - _texts = Empty._texts; - } - } + private readonly string[] _texts; /// /// Initializes a new instance of the class with the array of texts. @@ -207,47 +157,6 @@ IEnumerator IEnumerable.GetEnumerator() return _texts.GetEnumerator(); } - /// - /// Adds a text to the collection. - /// - /// Text to be added in the collection. - [ExcludeFromCodeCoverage] - [Obsolete("ValidationText will be made immutable in future versions, please do not use the Add(string) method.")] - public void Add(string text) - { - if (ReferenceEquals(this, Empty)) - { - throw new InvalidOperationException("Adding to ValidationText.Empty is unsupported."); - } - - if (ReferenceEquals(this, None)) - { - throw new InvalidOperationException("Adding to ValidationText.None is unsupported."); - } - - _texts = _texts.Concat(new[] { text }).ToArray(); - } - - /// - /// Clear all texts. - /// - [ExcludeFromCodeCoverage] - [Obsolete("ValidationText will be made immutable in future versions, please do not use the Clear() method.")] - public void Clear() - { - if (ReferenceEquals(this, Empty)) - { - throw new InvalidOperationException("Clearing ValidationText.Empty is unsupported."); - } - - if (ReferenceEquals(this, None)) - { - throw new InvalidOperationException("Clearing ValidationText.None is unsupported."); - } - - _texts = Array.Empty(); - } - /// /// Convert representation to a single line using a specified separator. /// diff --git a/src/ReactiveUI.Validation/Components/Abstractions/IPropertyValidationComponent.cs b/src/ReactiveUI.Validation/Components/Abstractions/IPropertyValidationComponent.cs index f172ff5a..fd81e4ca 100644 --- a/src/ReactiveUI.Validation/Components/Abstractions/IPropertyValidationComponent.cs +++ b/src/ReactiveUI.Validation/Components/Abstractions/IPropertyValidationComponent.cs @@ -3,22 +3,8 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for full license information. -using System; -using System.Diagnostics.CodeAnalysis; - namespace ReactiveUI.Validation.Components.Abstractions { - /// - /// A component specifically validating one or more typed properties. - /// - /// The validation target. - [Obsolete("Consider using the non-generic version of an IPropertyValidationComponent.")] - [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1649:FileHeaderFileNameDocumentationMustMatchTypeName", Justification = "Same type just generic.")] - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleType", Justification = "Same type just generic.")] - public interface IPropertyValidationComponent : IPropertyValidationComponent, IValidatesProperties - { - } - /// /// A component specifically validating one or more untyped properties. /// diff --git a/src/ReactiveUI.Validation/Components/Abstractions/IValidatesProperties.cs b/src/ReactiveUI.Validation/Components/Abstractions/IValidatesProperties.cs index 56388f7b..b5bfcf32 100644 --- a/src/ReactiveUI.Validation/Components/Abstractions/IValidatesProperties.cs +++ b/src/ReactiveUI.Validation/Components/Abstractions/IValidatesProperties.cs @@ -3,34 +3,10 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for full license information. -using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq.Expressions; namespace ReactiveUI.Validation.Components.Abstractions { - /// - /// Interface marking a validation component that validates specific typed properties. - /// - /// The validation target. - [Obsolete("Consider using the non-generic version of an IValidatesProperties.")] - [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1649:FileHeaderFileNameDocumentationMustMatchTypeName", Justification = "Same type just generic.")] - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleType", Justification = "Same type just generic.")] - public interface IValidatesProperties : IValidatesProperties - { - /// - /// Determine if a property name is actually contained within this. - /// - /// Any type. - /// ViewModel property. - /// Indicates if the property to find is unique. - /// Returns true if it contains the property, otherwise false. - [ExcludeFromCodeCoverage] - [Obsolete("Consider using the non-generic version of an IValidatesProperties.")] - bool ContainsProperty(Expression> propertyExpression, bool exclusively = false); - } - /// /// Interface marking a validation component that validates specific untyped properties. /// diff --git a/src/ReactiveUI.Validation/Components/BasePropertyValidation.cs b/src/ReactiveUI.Validation/Components/BasePropertyValidation.cs index 9fda118e..d8e513a9 100755 --- a/src/ReactiveUI.Validation/Components/BasePropertyValidation.cs +++ b/src/ReactiveUI.Validation/Components/BasePropertyValidation.cs @@ -25,7 +25,7 @@ namespace ReactiveUI.Validation.Components /// /// Base class for items which are used to build a . /// - public abstract class BasePropertyValidation : ReactiveObject, IDisposable, IPropertyValidationComponent, IPropertyValidationComponent + public abstract class BasePropertyValidation : ReactiveObject, IDisposable, IPropertyValidationComponent { [SuppressMessage("Usage", "CA2213:Disposable fields should be disposed", Justification = "Disposed by field _disposables.")] private readonly ReplaySubject _isValidSubject = new ReplaySubject(1); @@ -99,20 +99,6 @@ public void Dispose() GC.SuppressFinalize(this); } - /// - [ExcludeFromCodeCoverage] - [Obsolete("Consider using the non-generic ContainsProperty of a non-generic IPropertyValidationComponent.")] - public bool ContainsProperty(Expression> property, bool exclusively = false) - { - if (property is null) - { - throw new ArgumentNullException(nameof(property)); - } - - var propertyName = property.Body.GetPropertyPath(); - return ContainsPropertyName(propertyName, exclusively); - } - /// public bool ContainsPropertyName(string propertyName, bool exclusively = false) { @@ -280,7 +266,7 @@ protected override IObservable GetValidationChangeObservable() { Activate(); return _valueSubject - .Select(value => new ValidationState(_isValidFunc(value), _message(value, _isValidFunc(value)), this)) + .Select(value => new ValidationState(_isValidFunc(value), _message(value, _isValidFunc(value)))) .DistinctUntilChanged(new ValidationStateComparer()); } diff --git a/src/ReactiveUI.Validation/Components/ModelObservableValidation.cs b/src/ReactiveUI.Validation/Components/ModelObservableValidation.cs deleted file mode 100755 index 22453f0d..00000000 --- a/src/ReactiveUI.Validation/Components/ModelObservableValidation.cs +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright (c) 2020 .NET Foundation and Contributors. All rights reserved. -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Linq.Expressions; -using System.Reactive.Disposables; -using System.Reactive.Linq; -using System.Reactive.Subjects; -using ReactiveUI.Validation.Collections; -using ReactiveUI.Validation.Components.Abstractions; -using ReactiveUI.Validation.Extensions; -using ReactiveUI.Validation.States; - -namespace ReactiveUI.Validation.Components -{ - /// - /// - /// - /// - /// More generic observable for determination of validity. - /// - /// - /// Validates a single property. Though in the passed validityObservable more properties can be referenced. - /// We probably need a more 'complex' one, where the params of the validation block are - /// passed through? - /// Also, what about access to the view model to output the error message?. - /// - [ExcludeFromCodeCoverage] - [Obsolete("Consider using ObservableValidation instead.")] - public class ModelObservableValidation : ModelObservableValidationBase - { - /// - /// Initializes a new instance of the class. - /// - /// ViewModel instance. - /// ViewModel property referenced in validityObservable. - /// Observable to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModelProperty value. - public ModelObservableValidation( - TViewModel viewModel, - Expression> viewModelProperty, - Func> validityObservable, - string message) - : this(viewModel, viewModelProperty, validityObservable, (p, isValid) => - isValid ? ValidationText.Empty : ValidationText.Create(message)) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// ViewModel instance. - /// ViewModel property referenced in validityObservable. - /// Observable to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModelProperty value. - public ModelObservableValidation( - TViewModel viewModel, - Expression> viewModelProperty, - Func> validityObservable, - Func message) - : this(viewModel, viewModelProperty, validityObservable, (p, isValid) => - isValid ? ValidationText.Empty : ValidationText.Create(message(p))) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// ViewModel instance. - /// ViewModel property referenced in validityObservable. - /// Observable to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModel and validityObservable values. - public ModelObservableValidation( - TViewModel viewModel, - Expression> viewModelProperty, - Func> validityObservable, - Func messageFunc) - : this(viewModel, viewModelProperty, validityObservable, (vm, state) => - ValidationText.Create(messageFunc(vm, state))) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// ViewModel instance. - /// ViewModel property referenced in validityObservable. - /// Observable to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModel and validityObservable values. - private ModelObservableValidation( - TViewModel viewModel, - Expression> viewModelProperty, - Func> validityObservable, - Func messageFunc) - : base(viewModel, validityObservable, messageFunc) - { - // record this property name - AddProperty(viewModelProperty); - } - } - - /// - /// - /// - /// - /// More generic observable for determination of validity. - /// - /// - /// for backwards compatibility, validated properties are not explicitly defined, so we don't really know what's inside the validityObservable. - /// - [ExcludeFromCodeCoverage] - [Obsolete("Consider using ObservableValidation instead.")] - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleType", Justification = "Same class just different generic parameters.")] - public class ModelObservableValidation : ModelObservableValidationBase - { - /// - /// Initializes a new instance of the class. - /// - /// ViewModel instance. - /// Observable to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModelProperty value. - public ModelObservableValidation( - TViewModel viewModel, - Func> validityObservable, - string message) - : this(viewModel, validityObservable, (p, isValid) => - isValid ? ValidationText.Empty : ValidationText.Create(message)) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// ViewModel instance. - /// Observable to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModelProperty value. - public ModelObservableValidation( - TViewModel viewModel, - Func> validityObservable, - Func message) - : this(viewModel, validityObservable, (p, isValid) => - isValid ? ValidationText.Empty : ValidationText.Create(message(p))) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// ViewModel instance. - /// Observable to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModel and validityObservable values. - public ModelObservableValidation( - TViewModel viewModel, - Func> validityObservable, - Func messageFunc) - : this(viewModel, validityObservable, (vm, state) => ValidationText.Create(messageFunc(vm, state))) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// ViewModel instance. - /// Observable to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModel and validityObservable values. - private ModelObservableValidation( - TViewModel viewModel, - Func> validityObservable, - Func messageFunc) - : base(viewModel, validityObservable, messageFunc) - { - } - } - - /// - /// - /// - /// More generic observable for determination of validity. - /// - /// - /// We probably need a more 'complex' one, where the params of the validation block are - /// passed through? - /// Also, what about access to the view model to output the error message?. - /// - [ExcludeFromCodeCoverage] - [Obsolete("Consider using ObservableValidation instead.")] - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleType", Justification = "Same class just an abstract one.")] - public abstract class ModelObservableValidationBase : ReactiveObject, IDisposable, IPropertyValidationComponent, IPropertyValidationComponent - { - [SuppressMessage("Usage", "CA2213:Disposable fields should be disposed", Justification = "Disposed by field _disposables.")] - private readonly ReplaySubject _lastValidationStateSubject = new ReplaySubject(1); - private readonly HashSet _propertyNames = new HashSet(); - private readonly IConnectableObservable _validityConnectedObservable; - private readonly CompositeDisposable _disposables = new CompositeDisposable(); - private bool _isActive; - private bool _isValid; - private ValidationText? _text; - - /// - /// Initializes a new instance of the class. - /// - /// ViewModel instance. - /// Func to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModel and validityObservable values. - protected ModelObservableValidationBase( - TViewModel viewModel, - Func> validityObservable, - Func messageFunc) - { - _lastValidationStateSubject - .Do(state => - { - _isValid = state.IsValid; - _text = state.Text; - }) - .Subscribe() - .DisposeWith(_disposables); - - _validityConnectedObservable = Observable - .Defer(() => validityObservable(viewModel)) - .Select(v => new ValidationState(v, messageFunc(viewModel, v), this)) - .Multicast(_lastValidationStateSubject); - } - - /// - public int PropertyCount => _propertyNames.Count; - - /// - public IEnumerable Properties => _propertyNames.AsEnumerable(); - - /// - public ValidationText? Text - { - get - { - Activate(); - return _text; - } - } - - /// - public bool IsValid - { - get - { - Activate(); - return _isValid; - } - } - - /// - public IObservable ValidationStatusChange - { - get - { - Activate(); - return _validityConnectedObservable; - } - } - - /// - public void Dispose() - { - // Dispose of unmanaged resources. - Dispose(true); - - // Suppress finalization. - GC.SuppressFinalize(this); - } - - /// - [ExcludeFromCodeCoverage] - [Obsolete("Consider using the non-generic ContainsProperty of a non-generic IPropertyValidationComponent.")] - public bool ContainsProperty(Expression> property, bool exclusively = false) - { - if (property is null) - { - throw new ArgumentNullException(nameof(property)); - } - - var propertyName = property.Body.GetPropertyPath(); - return ContainsPropertyName(propertyName, exclusively); - } - - /// - public bool ContainsPropertyName(string propertyName, bool exclusively = false) - { - return exclusively - ? _propertyNames.Contains(propertyName) && _propertyNames.Count == 1 - : _propertyNames.Contains(propertyName); - } - - /// - /// Disposes of the managed resources. - /// - /// If its getting called by the method. - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - _disposables.Dispose(); - } - } - - /// - /// Adds a property to the list of this which this validation is associated with. - /// - /// Any type. - /// ViewModel property. - protected void AddProperty(Expression> property) - { - if (property is null) - { - throw new ArgumentNullException(nameof(property)); - } - - var propertyName = property.Body.GetPropertyPath(); - _propertyNames.Add(propertyName); - } - - private void Activate() - { - if (_isActive) - { - return; - } - - _isActive = true; - _disposables.Add(_validityConnectedObservable.Connect()); - } - } -} diff --git a/src/ReactiveUI.Validation/Components/ObservableValidation.cs b/src/ReactiveUI.Validation/Components/ObservableValidation.cs index f1017d23..34a6dfab 100644 --- a/src/ReactiveUI.Validation/Components/ObservableValidation.cs +++ b/src/ReactiveUI.Validation/Components/ObservableValidation.cs @@ -237,7 +237,7 @@ public ObservableValidation(IObservable observable) /// A validation component that is based on an . /// [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleType", Justification = "Same class just different generic parameters.")] - public abstract class ObservableValidationBase : ReactiveObject, IDisposable, IPropertyValidationComponent, IPropertyValidationComponent + public abstract class ObservableValidationBase : ReactiveObject, IDisposable, IPropertyValidationComponent { [SuppressMessage("Usage", "CA2213:Disposable fields should be disposed", Justification = "Disposed by field _disposables.")] private readonly ReplaySubject _isValidSubject = new ReplaySubject(1); @@ -335,20 +335,6 @@ public void Dispose() GC.SuppressFinalize(this); } - /// - [ExcludeFromCodeCoverage] - [Obsolete("Consider using the non-generic ContainsProperty of a non-generic IPropertyValidationComponent.")] - public bool ContainsProperty(Expression> property, bool exclusively = false) - { - if (property is null) - { - throw new ArgumentNullException(nameof(property)); - } - - var propertyName = property.Body.GetPropertyPath(); - return ContainsPropertyName(propertyName, exclusively); - } - /// public bool ContainsPropertyName(string propertyName, bool exclusively = false) => exclusively diff --git a/src/ReactiveUI.Validation/Contexts/ValidationContext.cs b/src/ReactiveUI.Validation/Contexts/ValidationContext.cs index 2b37d483..e531fcfb 100755 --- a/src/ReactiveUI.Validation/Contexts/ValidationContext.cs +++ b/src/ReactiveUI.Validation/Contexts/ValidationContext.cs @@ -86,7 +86,7 @@ public ValidationContext(IScheduler? scheduler = null) .DisposeWith(_disposables); _validSubject - .Select(_ => new ValidationState(IsValid, BuildText(), this)) + .Select(_ => new ValidationState(IsValid, BuildText())) .Do(_validationStatusChange.OnNext) .Subscribe() .DisposeWith(_disposables); diff --git a/src/ReactiveUI.Validation/Extensions/ExpressionExtensions.cs b/src/ReactiveUI.Validation/Extensions/ExpressionExtensions.cs index fd74c74d..60b3e360 100644 --- a/src/ReactiveUI.Validation/Extensions/ExpressionExtensions.cs +++ b/src/ReactiveUI.Validation/Extensions/ExpressionExtensions.cs @@ -3,6 +3,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for full license information. +using System; using System.Linq.Expressions; using System.Text; @@ -35,7 +36,10 @@ public static string GetPropertyPath(this Expression expression) path.Insert(0, memberExpression.Member.Name); - expression = memberExpression.Expression; + expression = memberExpression.Expression ?? + throw new ArgumentException( + $"Unable to obtain parent expression of {memberExpression.Member.Name}", + nameof(expression)); } return path.ToString(); diff --git a/src/ReactiveUI.Validation/Extensions/ValidatableViewModelExtensions.cs b/src/ReactiveUI.Validation/Extensions/ValidatableViewModelExtensions.cs index f9e960e5..99b39484 100644 --- a/src/ReactiveUI.Validation/Extensions/ValidatableViewModelExtensions.cs +++ b/src/ReactiveUI.Validation/Extensions/ValidatableViewModelExtensions.cs @@ -516,293 +516,6 @@ public static IObservable IsValid(this TViewModel viewModel) return viewModel.ValidationContext.Valid; } - /// - /// Setup a validation rule with a general observable indicating validity. - /// - /// ViewModel type. - /// ViewModel instance. - /// Func to define if the viewModel is valid or not. - /// Validation error message. - /// Returns a object. - /// - /// It should be noted that the observable should provide an initial value, otherwise that can result - /// in an inconsistent performance. - /// - [ExcludeFromCodeCoverage] - [Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ValidationHelper ValidationRule( - this TViewModel viewModel, - Func> viewModelObservableProperty, - string message) - where TViewModel : IReactiveObject, IValidatableViewModel - { - if (viewModel is null) - { - throw new ArgumentNullException(nameof(viewModel)); - } - - if (viewModelObservableProperty is null) - { - throw new ArgumentNullException(nameof(viewModelObservableProperty)); - } - - if (message is null) - { - throw new ArgumentNullException(nameof(message)); - } - - return viewModel.RegisterValidation( - new ObservableValidation( - viewModel, - viewModelObservableProperty(viewModel), - validity => validity, - message)); - } - - /// - /// Setup a validation rule with a general observable indicating validity. - /// - /// ViewModel type. - /// ViewModel instance. - /// Func to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModel and viewModelObservableProperty values. - /// Returns a object. - /// - /// It should be noted that the observable should provide an initial value, otherwise that can result - /// in an inconsistent performance. - /// - [ExcludeFromCodeCoverage] - [Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ValidationHelper ValidationRule( - this TViewModel viewModel, - Func> viewModelObservableProperty, - Func messageFunc) - where TViewModel : IReactiveObject, IValidatableViewModel - { - if (viewModel is null) - { - throw new ArgumentNullException(nameof(viewModel)); - } - - if (viewModelObservableProperty is null) - { - throw new ArgumentNullException(nameof(viewModelObservableProperty)); - } - - if (messageFunc is null) - { - throw new ArgumentNullException(nameof(messageFunc)); - } - - return viewModel.RegisterValidation( - new ObservableValidation( - viewModel, - viewModelObservableProperty(viewModel), - (vm, state) => state, - (vm, state) => messageFunc(vm))); - } - - /// - /// Setup a validation rule with a general observable indicating validity. - /// - /// ViewModel type. - /// ViewModel instance. - /// Func to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModel and viewModelObservableProperty values. - /// Returns a object. - /// - /// It should be noted that the observable should provide an initial value, otherwise that can result - /// in an inconsistent performance. - /// - [ExcludeFromCodeCoverage] - [Obsolete("This overload is planned for future removal. Consider using either the overload that accepts a " + - "Func as the messageFunc parameter, or the overload that accepts a string.")] - public static ValidationHelper ValidationRule( - this TViewModel viewModel, - Func> viewModelObservableProperty, - Func messageFunc) - where TViewModel : IReactiveObject, IValidatableViewModel - { - if (viewModel is null) - { - throw new ArgumentNullException(nameof(viewModel)); - } - - if (viewModelObservableProperty is null) - { - throw new ArgumentNullException(nameof(viewModelObservableProperty)); - } - - if (messageFunc is null) - { - throw new ArgumentNullException(nameof(messageFunc)); - } - - return viewModel.RegisterValidation( - new ObservableValidation( - viewModel, - viewModelObservableProperty(viewModel), - (vm, validity) => validity, - (vm, state, isValid) => messageFunc(vm, isValid))); - } - - /// - /// Setup a validation rule with a general observable indicating validity. - /// - /// ViewModel type. - /// ViewModel property type. - /// ViewModel instance. - /// ViewModel property referenced in viewModelObservableProperty. - /// Func to define if the viewModel is valid or not. - /// Validation error message. - /// Returns a object. - /// - /// It should be noted that the observable should provide an initial value, otherwise that can result - /// in an inconsistent performance. - /// - [ExcludeFromCodeCoverage] - [Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ValidationHelper ValidationRule( - this TViewModel viewModel, - Expression> viewModelProperty, - Func> viewModelObservableProperty, - string message) - where TViewModel : IReactiveObject, IValidatableViewModel - { - if (viewModel is null) - { - throw new ArgumentNullException(nameof(viewModel)); - } - - if (viewModelProperty is null) - { - throw new ArgumentNullException(nameof(viewModelProperty)); - } - - if (viewModelObservableProperty is null) - { - throw new ArgumentNullException(nameof(viewModelObservableProperty)); - } - - if (message is null) - { - throw new ArgumentNullException(nameof(message)); - } - - return viewModel.RegisterValidation( - new ObservableValidation( - viewModel, - viewModelProperty, - viewModelObservableProperty(viewModel), - validity => validity, - message)); - } - - /// - /// Setup a validation rule with a general observable indicating validity. - /// - /// ViewModel type. - /// ViewModel property type. - /// ViewModel instance. - /// ViewModel property referenced in viewModelObservableProperty. - /// Func to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModel and viewModelObservableProperty values. - /// Returns a object. - /// - /// It should be noted that the observable should provide an initial value, otherwise that can result - /// in an inconsistent performance. - /// - [ExcludeFromCodeCoverage] - [Obsolete("Use the overload accepting just IObservable instead of Func>")] - public static ValidationHelper ValidationRule( - this TViewModel viewModel, - Expression> viewModelProperty, - Func> viewModelObservableProperty, - Func messageFunc) - where TViewModel : IReactiveObject, IValidatableViewModel - { - if (viewModel is null) - { - throw new ArgumentNullException(nameof(viewModel)); - } - - if (viewModelProperty is null) - { - throw new ArgumentNullException(nameof(viewModelProperty)); - } - - if (viewModelObservableProperty is null) - { - throw new ArgumentNullException(nameof(viewModelObservableProperty)); - } - - if (messageFunc is null) - { - throw new ArgumentNullException(nameof(messageFunc)); - } - - return viewModel.RegisterValidation( - new ObservableValidation( - viewModel, - viewModelProperty, - viewModelObservableProperty(viewModel), - (vm, validity) => validity, - (vm, state) => messageFunc(vm))); - } - - /// - /// Setup a validation rule with a general observable indicating validity. - /// - /// ViewModel type. - /// ViewModel property type. - /// ViewModel instance. - /// ViewModel property referenced in viewModelObservableProperty. - /// Func to define if the viewModel is valid or not. - /// Func to define the validation error message based on the viewModel and viewModelObservableProperty values. - /// Returns a object. - /// - /// It should be noted that the observable should provide an initial value, otherwise that can result - /// in an inconsistent performance. - /// - [ExcludeFromCodeCoverage] - [Obsolete("This overload is planned for future removal. Consider using either the overload that accepts a " + - "Func as the messageFunc parameter, or the overload that accepts a string.")] - public static ValidationHelper ValidationRule( - this TViewModel viewModel, - Expression> viewModelProperty, - Func> viewModelObservableProperty, - Func messageFunc) - where TViewModel : IReactiveObject, IValidatableViewModel - { - if (viewModel is null) - { - throw new ArgumentNullException(nameof(viewModel)); - } - - if (viewModelProperty is null) - { - throw new ArgumentNullException(nameof(viewModelProperty)); - } - - if (viewModelObservableProperty is null) - { - throw new ArgumentNullException(nameof(viewModelObservableProperty)); - } - - if (messageFunc is null) - { - throw new ArgumentNullException(nameof(messageFunc)); - } - - return viewModel.RegisterValidation( - new ObservableValidation( - viewModel, - viewModelProperty, - viewModelObservableProperty(viewModel), - (vm, validity) => validity, - (vm, state, validity) => messageFunc(vm, validity))); - } - /// /// Registers an into the /// of the specified . Disposes and removes the diff --git a/src/ReactiveUI.Validation/Extensions/ValidationContextExtensions.cs b/src/ReactiveUI.Validation/Extensions/ValidationContextExtensions.cs index 4e5a3aa1..084ff0c6 100755 --- a/src/ReactiveUI.Validation/Extensions/ValidationContextExtensions.cs +++ b/src/ReactiveUI.Validation/Extensions/ValidationContextExtensions.cs @@ -60,131 +60,5 @@ public static class ValidationContextExtensions .StartWith(initial)) .Switch(); } - - /// - /// Resolves the property valuation for a specified property. - /// - /// ViewModel type. - /// ViewModel property type. - /// ValidationContext instance. - /// ViewModel property. - /// Indicates if the ViewModel property to find is unique. - /// Returns a collection of objects. - [ExcludeFromCodeCoverage] - [Obsolete("Since we support adding and removing validation rules dynamically, consider " + - "using either the ObserveFor extension method, or BindValidation.")] - public static IEnumerable> ResolveFor( - this ValidationContext context, - Expression> viewModelProperty, - bool strict = true) - { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - - if (viewModelProperty is null) - { - throw new ArgumentNullException(nameof(viewModelProperty)); - } - - return context - .Validations - .OfType>() - .Where(v => v.ContainsProperty(viewModelProperty, strict)); - } - - /// - /// Resolves the property valuation for two properties. - /// - /// ViewModel type. - /// ViewModel first property type. - /// ViewModel second property type. - /// ValidationContext instance. - /// First ViewModel property. - /// Second ViewModel property. - /// Returns a collection of objects. - [ExcludeFromCodeCoverage] - [Obsolete("Since we support adding and removing validation rules dynamically, consider " + - "using either the ObserveFor extension method, or BindValidation.")] - public static IEnumerable> ResolveFor( - this ValidationContext context, - Expression> viewModelProperty1, - Expression> viewModelProperty2) - { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - - if (viewModelProperty1 is null) - { - throw new ArgumentNullException(nameof(viewModelProperty1)); - } - - if (viewModelProperty2 is null) - { - throw new ArgumentNullException(nameof(viewModelProperty2)); - } - - return context - .Validations - .OfType>() - .Where(v => v.ContainsProperty(viewModelProperty1) && - v.ContainsProperty(viewModelProperty2) && - v.PropertyCount == 2); - } - - /// - /// Resolves the property valuation for three properties. - /// - /// ViewModel type. - /// ViewModel first property type. - /// ViewModel second property type. - /// ViewModel third property type. - /// ValidationContext instance. - /// First ViewModel property. - /// Second ViewModel property. - /// Third ViewModel property. - /// Returns a collection of objects. - [ExcludeFromCodeCoverage] - [Obsolete("Since we support adding and removing validation rules dynamically, consider " + - "using either the ObserveFor extension method, or BindValidation.")] - public static IEnumerable> ResolveFor( - this ValidationContext context, - Expression> viewModelProperty1, - Expression> viewModelProperty2, - Expression> viewModelProperty3) - { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - - if (viewModelProperty1 is null) - { - throw new ArgumentNullException(nameof(viewModelProperty1)); - } - - if (viewModelProperty2 is null) - { - throw new ArgumentNullException(nameof(viewModelProperty2)); - } - - if (viewModelProperty3 is null) - { - throw new ArgumentNullException(nameof(viewModelProperty3)); - } - - return context - .Validations - .OfType>() - .Where(v => v.ContainsProperty(viewModelProperty1) && - v.ContainsProperty(viewModelProperty2) && - v.ContainsProperty(viewModelProperty3) && - v.PropertyCount == 3); - } } } diff --git a/src/ReactiveUI.Validation/Extensions/ViewForExtensions.cs b/src/ReactiveUI.Validation/Extensions/ViewForExtensions.cs index 11de9258..585b4e83 100755 --- a/src/ReactiveUI.Validation/Extensions/ViewForExtensions.cs +++ b/src/ReactiveUI.Validation/Extensions/ViewForExtensions.cs @@ -22,49 +22,6 @@ namespace ReactiveUI.Validation.Extensions [SuppressMessage("Roslynator", "RCS1163", Justification = "Needed for Expression context.")] public static class ViewForExtensions { - /// - /// Binds the specified ViewModel property validation to the View property. - /// - /// Supports multiple validations for the same property. - /// IViewFor of TViewModel. - /// ViewModel type. - /// ViewModel property type. - /// View property type. - /// IViewFor instance. - /// ViewModel instance. Can be null, used for generic type resolution. - /// ViewModel property. - /// View property to bind the validation message. - /// - /// Validation formatter. Defaults to . In order to override the global - /// default value, implement and register an instance of - /// IValidationTextFormatter<string> into Splat.Locator. - /// - /// Returns a object. - [ExcludeFromCodeCoverage] - [Obsolete("This method is no longer required, BindValidation now supports multiple validations.")] - [SuppressMessage("Design", "CA1801: Parameter unused", Justification = "Used for generic resolution")] - public static IDisposable BindValidationEx( - this TView view, - TViewModel? viewModel, - Expression> viewModelProperty, - Expression> viewProperty, - IValidationTextFormatter? formatter = null) - where TView : IViewFor - where TViewModel : class, IReactiveObject, IValidatableViewModel - { - if (viewModelProperty is null) - { - throw new ArgumentNullException(nameof(viewModelProperty)); - } - - if (viewProperty is null) - { - throw new ArgumentNullException(nameof(viewProperty)); - } - - return ValidationBinding.ForProperty(view, viewModelProperty, viewProperty, formatter); - } - /// /// Binds the specified ViewModel property validation to the View property. /// @@ -175,56 +132,5 @@ public static class ViewForExtensions return ValidationBinding.ForValidationHelperProperty(view, viewModelHelperProperty, viewProperty, formatter); } - - /// - /// Creates a binding to a View property. - /// - /// Observable of any type. - /// Any type. - /// Current observable instance. - /// Target instance. - /// Expression to discover View properties. - /// Returns a object. - [ExcludeFromCodeCoverage] - [Obsolete("This method is a part of ReactiveUI internals and will be " + - "removed from ReactiveUI.Validation public API soon.")] - public static IDisposable BindToDirect( - IObservable @this, - TTarget target, - Expression viewExpression) - { - if (@this is null) - { - throw new ArgumentNullException(nameof(@this)); - } - - if (target is null) - { - throw new ArgumentNullException(nameof(target)); - } - - if (viewExpression is null) - { - throw new ArgumentNullException(nameof(viewExpression)); - } - - var setter = Reflection.GetValueSetterOrThrow(viewExpression.GetMemberInfo())!; - if (viewExpression.GetParent().NodeType == ExpressionType.Parameter) - { - return @this.Subscribe( - x => setter(target, x, viewExpression.GetArgumentsArray()), - ex => LogHost.Default.Error(ex, $"{viewExpression} Binding received an Exception!")); - } - - var bindInfo = @this.CombineLatest( - target.WhenAnyDynamic(viewExpression.GetParent(), x => x.Value), - (val, host) => new { val, host }); - - return bindInfo - .Where(x => x.host != null) - .Subscribe( - x => setter(x.host, x.val, viewExpression.GetArgumentsArray()), - ex => LogHost.Default.Error(ex, $"{viewExpression} Binding received an Exception!")); - } } } diff --git a/src/ReactiveUI.Validation/Helpers/ReactiveValidationObject.cs b/src/ReactiveUI.Validation/Helpers/ReactiveValidationObject.cs index 466f6fbb..4d93d6e9 100644 --- a/src/ReactiveUI.Validation/Helpers/ReactiveValidationObject.cs +++ b/src/ReactiveUI.Validation/Helpers/ReactiveValidationObject.cs @@ -24,35 +24,6 @@ namespace ReactiveUI.Validation.Helpers { - /// - /// Base class for ReactiveObjects that support validation. - /// - /// The parent view model. - [ExcludeFromCodeCoverage] - [Obsolete("The type parameters are no longer required. Use the non-generic version of ReactiveValidationObject.")] - [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1649:FileHeaderFileNameDocumentationMustMatchTypeName", Justification = "Same class just generic.")] - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleType", Justification = "Same class just generic.")] - public abstract class ReactiveValidationObject : ReactiveValidationObject - { - /// - /// Initializes a new instance of the class. - /// - /// - /// Scheduler for the . Uses by default. - /// - /// - /// Validation formatter. Defaults to . In order to override the global - /// default value, implement and register an instance of - /// IValidationTextFormatter<string> into Splat.Locator. - /// - protected ReactiveValidationObject( - IScheduler? scheduler = null, - IValidationTextFormatter? formatter = null) - : base(scheduler, formatter) - { - } - } - /// /// Base class for ReactiveObjects that support validation. /// diff --git a/src/ReactiveUI.Validation/ReactiveUI.Validation.csproj b/src/ReactiveUI.Validation/ReactiveUI.Validation.csproj index e1b67815..097caf0d 100644 --- a/src/ReactiveUI.Validation/ReactiveUI.Validation.csproj +++ b/src/ReactiveUI.Validation/ReactiveUI.Validation.csproj @@ -1,14 +1,14 @@  - MonoAndroid90;Xamarin.iOS10;Xamarin.Mac20;Xamarin.TVOS10;tizen40;netstandard2.0 - $(TargetFrameworks);net461;uap10.0.17763 + MonoAndroid10.0;Xamarin.iOS10;Xamarin.Mac20;Xamarin.TVOS10;tizen40;netstandard2.0;net5.0 + $(TargetFrameworks);net461;net472;uap10.0.17763;net5.0-windows;net5.0-windows10.0.19041 $(NoWarn);CS1591 enable latest - + diff --git a/src/ReactiveUI.Validation/States/ValidationState.cs b/src/ReactiveUI.Validation/States/ValidationState.cs index ac22fa82..643710e1 100755 --- a/src/ReactiveUI.Validation/States/ValidationState.cs +++ b/src/ReactiveUI.Validation/States/ValidationState.cs @@ -41,41 +41,6 @@ public ValidationState(bool isValid, ValidationText text) Text = text ?? throw new ArgumentNullException(nameof(text)); } - /// - /// Initializes a new instance of the class. - /// - /// Determines if the property is valid or not. - /// Validation text. - /// Validation property. - [ExcludeFromCodeCoverage] - [Obsolete("This constructor overload is going to be removed soon.")] - public ValidationState(bool isValid, string text, IValidationComponent component) - : this(isValid, ValidationText.Create(text), component) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// Determines if the property is valid or not. - /// Validation text. - /// Validation property. - [ExcludeFromCodeCoverage] - [Obsolete("This constructor overload is going to be removed soon.")] - public ValidationState(bool isValid, ValidationText text, IValidationComponent component) - { - IsValid = isValid; - Text = text ?? throw new ArgumentNullException(nameof(text)); - Component = component; - } - - /// - /// Gets the associated component. - /// - [ExcludeFromCodeCoverage] - [Obsolete("This property will be removed soon.")] - public IValidationComponent? Component { get; } - /// /// Gets a value indicating whether the validation is currently valid or not. /// diff --git a/src/ReactiveUI.Validation/TemplateGenerators/PropertyValidationGenerator.cs b/src/ReactiveUI.Validation/TemplateGenerators/PropertyValidationGenerator.cs index f71d29db..f7af76a6 100755 --- a/src/ReactiveUI.Validation/TemplateGenerators/PropertyValidationGenerator.cs +++ b/src/ReactiveUI.Validation/TemplateGenerators/PropertyValidationGenerator.cs @@ -126,7 +126,7 @@ protected override IObservable GetValidationChangeObservable() return _valueSubject.Select(value => { var isValid = _isValidFunc(value); - return new ValidationState(isValid, GetMessage(value, isValid), this); + return new ValidationState(isValid, GetMessage(value, isValid)); }).DistinctUntilChanged(new ValidationStateComparer()); } @@ -272,7 +272,7 @@ protected override IObservable GetValidationChangeObservable() return _valueSubject.Select(value => { var isValid = _isValidFunc(value); - return new ValidationState(isValid, GetMessage(value, isValid), this); + return new ValidationState(isValid, GetMessage(value, isValid)); }).DistinctUntilChanged(new ValidationStateComparer()); } @@ -427,7 +427,7 @@ protected override IObservable GetValidationChangeObservable() return _valueSubject.Select(value => { var isValid = _isValidFunc(value); - return new ValidationState(isValid, GetMessage(value, isValid), this); + return new ValidationState(isValid, GetMessage(value, isValid)); }).DistinctUntilChanged(new ValidationStateComparer()); } @@ -591,7 +591,7 @@ protected override IObservable GetValidationChangeObservable() return _valueSubject.Select(value => { var isValid = _isValidFunc(value); - return new ValidationState(isValid, GetMessage(value, isValid), this); + return new ValidationState(isValid, GetMessage(value, isValid)); }).DistinctUntilChanged(new ValidationStateComparer()); } @@ -764,7 +764,7 @@ protected override IObservable GetValidationChangeObservable() return _valueSubject.Select(value => { var isValid = _isValidFunc(value); - return new ValidationState(isValid, GetMessage(value, isValid), this); + return new ValidationState(isValid, GetMessage(value, isValid)); }).DistinctUntilChanged(new ValidationStateComparer()); } diff --git a/src/ReactiveUI.Validation/TemplateGenerators/PropertyValidationGenerator.tt b/src/ReactiveUI.Validation/TemplateGenerators/PropertyValidationGenerator.tt index 8a4b617d..5d25a044 100755 --- a/src/ReactiveUI.Validation/TemplateGenerators/PropertyValidationGenerator.tt +++ b/src/ReactiveUI.Validation/TemplateGenerators/PropertyValidationGenerator.tt @@ -135,7 +135,7 @@ _disposables.Add(_valueSubject.Subscribe(v => LastValue = v)); return _valueSubject.Select(value => { var isValid = _isValidFunc(value); - return new ValidationState(isValid, GetMessage(value, isValid), this); + return new ValidationState(isValid, GetMessage(value, isValid)); }).DistinctUntilChanged(new ValidationStateComparer()); } diff --git a/src/ReactiveUI.Validation/ValidationBindings/ValidationBinding.cs b/src/ReactiveUI.Validation/ValidationBindings/ValidationBinding.cs index 152b2c5f..dc5d3619 100755 --- a/src/ReactiveUI.Validation/ValidationBindings/ValidationBinding.cs +++ b/src/ReactiveUI.Validation/ValidationBindings/ValidationBinding.cs @@ -368,7 +368,7 @@ public void Dispose() var viewExpression = Reflection.Rewrite(viewProperty.Body); var setter = Reflection.GetValueSetterOrThrow(viewExpression.GetMemberInfo())!; - if (viewExpression.GetParent().NodeType == ExpressionType.Parameter) + if (viewExpression.GetParent()?.NodeType == ExpressionType.Parameter) { return valueChange .Do(