public static IDisposable BindValidation <TView, TViewModel, TViewModelProperty, TViewProperty>(
            this TView view,
            TViewModel viewModel,
            Expression <Func <TViewModel, TViewModelProperty> > viewModelProperty,
            Expression <Func <TView, TViewProperty> > viewProperty,
            IValidationTextFormatter <string>?formatter = null)
            where TView : IViewFor <TViewModel>
            where TViewModel : class, IReactiveObject, IValidatableViewModel
        {
            if (viewModel is null)
            {
                throw new ArgumentNullException(nameof(viewModel));
            }

            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));
        }
示例#2
0
    public static IDisposable BindValidationEx <TView, TViewModel, TViewModelProperty>(
        this TView view,
        TViewModel?viewModel,
        Expression <Func <TViewModel, TViewModelProperty?> > viewModelProperty,
        TextInputLayout viewProperty,
        IValidationTextFormatter <string>?formatter = null)
        where TView : IViewFor <TViewModel>
        where TViewModel : class, IReactiveObject, IValidatableViewModel
    {
        if (view is null)
        {
            throw new ArgumentNullException(nameof(view));
        }

        if (viewModelProperty is null)
        {
            throw new ArgumentNullException(nameof(viewModelProperty));
        }

        if (viewProperty is null)
        {
            throw new ArgumentNullException(nameof(viewProperty));
        }

        formatter ??= Locator.Current.GetService <IValidationTextFormatter <string> >() ??
        SingleLineFormatter.Default;

        return(ValidationBinding.ForProperty(
                   view,
                   viewModelProperty,
                   (_, errors) => viewProperty.Error = errors.FirstOrDefault(msg => !string.IsNullOrEmpty(msg)),
                   formatter));
    }
示例#3
0
        /// <summary>
        /// Creates a binding from a <see cref="ValidationHelper" /> to a specified action.
        /// </summary>
        /// <remarks>DOES NOT support multiple validations for the same property.</remarks>
        /// <typeparam name="TView">ViewFor of ViewModel type.</typeparam>
        /// <typeparam name="TViewModel">ViewModel type.</typeparam>
        /// <typeparam name="TOut">Action return type.</typeparam>
        /// <param name="view">View instance.</param>
        /// <param name="viewModelHelperProperty">ViewModel's ValidationHelper property.</param>
        /// <param name="action">Action to be executed.</param>
        /// <param name="formatter">Validation formatter.</param>
        /// <returns>Returns a validation component.</returns>
        /// <exception cref="MultipleValidationNotSupportedException">
        /// Thrown if the ViewModel property has more than one validation associated.
        /// </exception>
        public static IValidationBinding ForValidationHelperProperty <TView, TViewModel, TOut>(
            TView view,
            Expression <Func <TViewModel, ValidationHelper> > viewModelHelperProperty,
            Action <ValidationState, TOut> action,
            IValidationTextFormatter <TOut> formatter = null)
            where TView : IViewFor <TViewModel>
            where TViewModel : ReactiveObject, ISupportsValidation
        {
            if (formatter == null)
            {
                throw new ArgumentNullException(nameof(formatter));
            }

            var vcObs = view.WhenAnyValue(v => v.ViewModel)
                        .Where(vm => vm != null)
                        .Select(
                viewModel =>
                viewModel.WhenAnyValue(viewModelHelperProperty)
                .SelectMany(vy => vy.ValidationChanged))
                        .Switch()
                        .Select(vc => new { ValidationChange = vc, Formatted = formatter.Format(vc.Text) });

            var updateObs = vcObs.Do(r => action(r.ValidationChange, r.Formatted))
                            .Select(_ => Unit.Default);

            return(new ValidationBinding(updateObs));
        }
示例#4
0
        /// <summary>
        /// Create a binding between a view model property and a view property.
        /// </summary>
        /// <remarks>Supports multiple validations for the same property.</remarks>
        /// <typeparam name="TView">ViewFor of ViewModel type.</typeparam>
        /// <typeparam name="TViewModel">ViewModel type.</typeparam>
        /// <typeparam name="TViewModelProperty">ViewModel property type.</typeparam>
        /// <typeparam name="TViewProperty">View property type.</typeparam>
        /// <param name="view">View instance.</param>
        /// <param name="viewModelProperty">ViewModel property.</param>
        /// <param name="viewProperty">View property.</param>
        /// <param name="formatter">Validation formatter.</param>
        /// <param name="strict">Indicates if the ViewModel property to find is unique.</param>
        /// <returns>Returns a validation component.</returns>
        public static IValidationBinding ForProperty <TView, TViewModel, TViewModelProperty, TViewProperty>(
            TView view,
            Expression <Func <TViewModel, TViewModelProperty> > viewModelProperty,
            Expression <Func <TView, TViewProperty> > viewProperty,
            IValidationTextFormatter <string> formatter = null,
            bool strict = true)
            where TView : IViewFor <TViewModel>
            where TViewModel : ReactiveObject, ISupportsValidation
        {
            if (formatter == null)
            {
                formatter = SingleLineFormatter.Default;
            }

            var vcObs = view.WhenAnyValue(v => v.ViewModel)
                        .Where(vm => vm != null)
                        .Select(
                viewModel => viewModel.ValidationContext
                .ResolveForMultiple(viewModelProperty, strict)
                .Select(x => x.ValidationStatusChange)
                .CombineLatest())
                        .Switch()
                        .Select(states => states.Select(state => formatter.Format(state.Text)).ToList());

            var updateObs = BindToView(vcObs, view, viewProperty)
                            .Select(_ => Unit.Default);

            return(new ValidationBindingEx(updateObs));
        }
示例#5
0
        /// <summary>
        /// Creates a binding from a specified ViewModel property to a provided action.
        /// </summary>
        /// <remarks>DOES NOT support multiple validations for the same property.</remarks>
        /// <typeparam name="TView">ViewFor of ViewModel type.</typeparam>
        /// <typeparam name="TViewModel">ViewModel type.</typeparam>
        /// <typeparam name="TViewModelProperty">ViewModel property type.</typeparam>
        /// <typeparam name="TOut">Action return type.</typeparam>
        /// <param name="view">View instance.</param>
        /// <param name="viewModelProperty">ViewModel property.</param>
        /// <param name="action">Action to be executed.</param>
        /// <param name="formatter">Validation formatter.</param>
        /// <param name="strict">Indicates if the ViewModel property to find is unique.</param>
        /// <returns>Returns a validation component.</returns>
        /// <exception cref="MultipleValidationNotSupportedException">
        /// Thrown if the ViewModel property has more than one validation associated.
        /// </exception>
        public static IValidationBinding ForProperty <TView, TViewModel, TViewModelProperty, TOut>(
            TView view,
            Expression <Func <TViewModel, TViewModelProperty> > viewModelProperty,
            Action <ValidationState, TOut> action,
            IValidationTextFormatter <TOut> formatter = null,
            bool strict = true)
            where TView : IViewFor <TViewModel>
            where TViewModel : ReactiveObject, ISupportsValidation
        {
            if (formatter == null)
            {
                throw new ArgumentNullException(nameof(formatter));
            }

            var vcObs = view.WhenAnyValue(v => v.ViewModel)
                        .Where(vm => vm != null)
                        .Select(
                viewModel =>
                viewModel.ValidationContext
                .ResolveFor(viewModelProperty, strict)
                .ValidationStatusChange)
                        .Switch()
                        .Select(vc => new { ValidationChange = vc, Formatted = formatter.Format(vc.Text) })
                        .Do(r => action(r.ValidationChange, r.Formatted))
                        .Select(_ => Unit.Default);

            return(new ValidationBinding(vcObs));
        }
示例#6
0
        /// <summary>
        /// Creates a binding between a <see cref="ValidationHelper" /> and a specified View property.
        /// </summary>
        /// <remarks>DOES NOT support multiple validations for the same property.</remarks>
        /// <typeparam name="TView">ViewFor of ViewModel type.</typeparam>
        /// <typeparam name="TViewModel">ViewModel type.</typeparam>
        /// <typeparam name="TViewProperty">View property type.</typeparam>
        /// <param name="view">View instance.</param>
        /// <param name="viewModelHelperProperty">ViewModel's ValidationHelper property.</param>
        /// <param name="viewProperty">View property to bind the validation message.</param>
        /// <param name="formatter">Validation formatter.</param>
        /// <returns>Returns a validation component.</returns>
        /// <exception cref="MultipleValidationNotSupportedException">
        /// Thrown if the ViewModel property has more than one validation associated.
        /// </exception>
        public static IValidationBinding ForValidationHelperProperty <TView, TViewModel, TViewProperty>(
            TView view,
            Expression <Func <TViewModel, ValidationHelper> > viewModelHelperProperty,
            Expression <Func <TView, TViewProperty> > viewProperty,
            IValidationTextFormatter <string> formatter = null)
            where TView : IViewFor <TViewModel>
            where TViewModel : ReactiveObject, ISupportsValidation
        {
            if (formatter == null)
            {
                formatter = SingleLineFormatter.Default;
            }

            var vcObs = view.WhenAnyValue(v => v.ViewModel)
                        .Where(vm => vm != null)
                        .Select(
                viewModel =>
                viewModel.WhenAnyValue(viewModelHelperProperty)
                .SelectMany(vy => vy.ValidationChanged))
                        .Switch()
                        .Select(vc => formatter.Format(vc.Text));

            var updateObs = BindToView(vcObs, view, viewProperty)
                            .Select(_ => Unit.Default);

            return(new ValidationBinding(updateObs));
        }
        /// <summary>
        /// Creates a binding between a ViewModel and a View property.
        /// </summary>
        /// <typeparam name="TView">ViewFor of ViewModel type.</typeparam>
        /// <typeparam name="TViewModel">ViewModel type.</typeparam>
        /// <typeparam name="TViewProperty">View property type.</typeparam>
        /// <param name="view">View instance.</param>
        /// <param name="viewProperty">View property to bind the validation message.</param>
        /// <param name="formatter">Validation formatter.</param>
        /// <returns>Returns a validation component.</returns>
        public static IValidationBinding ForViewModel <TView, TViewModel, TViewProperty>(
            TView view,
            Expression <Func <TView, TViewProperty> > viewProperty,
            IValidationTextFormatter <string>?formatter = null)
            where TView : IViewFor <TViewModel>
            where TViewModel : ReactiveObject, IValidatableViewModel
        {
            if (view is null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            if (viewProperty is null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            formatter ??= SingleLineFormatter.Default;

            var vcObs = view
                        .WhenAnyValue(v => v.ViewModel)
                        .Where(vm => vm != null)
                        .SelectMany(vm => vm !.ValidationContext.ValidationStatusChange)
                        .Select(vc => formatter.Format(vc.Text));

            var updateObs = BindToView(vcObs, view, viewProperty)
                            .Select(_ => Unit.Default);

            return(new ValidationBinding(updateObs));
        }
        /// <summary>
        /// Creates a binding between a ViewModel and a specified action.
        /// </summary>
        /// <typeparam name="TView">ViewFor of ViewModel type.</typeparam>
        /// <typeparam name="TViewModel">ViewModel type.</typeparam>
        /// <typeparam name="TOut">Action return type.</typeparam>
        /// <param name="view">View instance.</param>
        /// <param name="action">Action to be executed.</param>
        /// <param name="formatter">Validation formatter.</param>
        /// <returns>Returns a validation component.</returns>
        public static IValidationBinding ForViewModel <TView, TViewModel, TOut>(
            TView view,
            Action <TOut> action,
            IValidationTextFormatter <TOut> formatter)
            where TView : IViewFor <TViewModel>
            where TViewModel : ReactiveObject, IValidatableViewModel
        {
            if (view is null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            if (action is null)
            {
                throw new ArgumentNullException(nameof(action));
            }

            if (formatter is null)
            {
                throw new ArgumentNullException(nameof(formatter));
            }

            var vcObs = view
                        .WhenAnyValue(v => v.ViewModel)
                        .Where(vm => vm != null)
                        .Select(vm => vm !.ValidationContext.Text)
                        .Select(formatter.Format);

            var updateObs = vcObs
                            .Do(action)
                            .Select(_ => Unit.Default);

            return(new ValidationBinding(updateObs));
        }
        /// <summary>
        /// Creates a binding from a specified ViewModel property to a provided action.
        /// </summary>
        /// <typeparam name="TView">ViewFor of ViewModel type.</typeparam>
        /// <typeparam name="TViewModel">ViewModel type.</typeparam>
        /// <typeparam name="TViewModelProperty">ViewModel property type.</typeparam>
        /// <typeparam name="TOut">Action return type.</typeparam>
        /// <param name="view">View instance.</param>
        /// <param name="viewModelProperty">ViewModel property.</param>
        /// <param name="action">Action to be executed.</param>
        /// <param name="formatter">Validation formatter.</param>
        /// <param name="strict">Indicates if the ViewModel property to find is unique.</param>
        /// <returns>Returns a validation component.</returns>
        public static IValidationBinding ForProperty <TView, TViewModel, TViewModelProperty, TOut>(
            TView view,
            Expression <Func <TViewModel, TViewModelProperty> > viewModelProperty,
            Action <IList <ValidationState>, IList <TOut> > action,
            IValidationTextFormatter <TOut> formatter,
            bool strict = true)
            where TView : IViewFor <TViewModel>
            where TViewModel : ReactiveObject, IValidatableViewModel
        {
            if (view is null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            if (viewModelProperty is null)
            {
                throw new ArgumentNullException(nameof(viewModelProperty));
            }

            if (action is null)
            {
                throw new ArgumentNullException(nameof(action));
            }

            if (formatter == null)
            {
                throw new ArgumentNullException(nameof(formatter));
            }

            var vcObs = view
                        .WhenAnyValue(v => v.ViewModel)
                        .Where(vm => vm != null)
                        .Select(
                viewModel => viewModel !
                .ValidationContext
                .ResolveFor(viewModelProperty, strict)
                .Select(x => x.ValidationStatusChange)
                .CombineLatest())
                        .Switch()
                        .Select(states => new
            {
                ValidationChange = states,
                Formatted        = states
                                   .Select(state => formatter.Format(state.Text))
                                   .ToList()
            })
                        .Do(r => action(r.ValidationChange, r.Formatted))
                        .Select(_ => Unit.Default);

            return(new ValidationBinding(vcObs));
        }
        /// <summary>
        /// Creates a binding between a ViewModel property and a view property.
        /// </summary>
        /// <typeparam name="TView">ViewFor of ViewModel type.</typeparam>
        /// <typeparam name="TViewModel">ViewModel type.</typeparam>
        /// <typeparam name="TViewModelProperty">ViewModel property type.</typeparam>
        /// <typeparam name="TViewProperty">View property type.</typeparam>
        /// <param name="view">View instance.</param>
        /// <param name="viewModelProperty">ViewModel property.</param>
        /// <param name="viewProperty">View property.</param>
        /// <param name="formatter">Validation formatter. Defaults to the <see cref="SingleLineFormatter"/>.</param>
        /// <param name="strict">Indicates if the ViewModel property to find is unique.</param>
        /// <returns>Returns a validation component.</returns>
        public static IValidationBinding ForProperty <TView, TViewModel, TViewModelProperty, TViewProperty>(
            TView view,
            Expression <Func <TViewModel, TViewModelProperty> > viewModelProperty,
            Expression <Func <TView, TViewProperty> > viewProperty,
            IValidationTextFormatter <string>?formatter = null,
            bool strict = true)
            where TView : IViewFor <TViewModel>
            where TViewModel : ReactiveObject, IValidatableViewModel
        {
            if (view is null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            if (viewModelProperty is null)
            {
                throw new ArgumentNullException(nameof(viewModelProperty));
            }

            if (viewProperty is null)
            {
                throw new ArgumentNullException(nameof(viewProperty));
            }

            formatter ??= SingleLineFormatter.Default;

            var vcObs = view
                        .WhenAnyValue(v => v.ViewModel)
                        .Where(vm => vm != null)
                        .Select(
                viewModel => viewModel !
                .ValidationContext
                .ResolveFor(viewModelProperty, strict)
                .Select(x => x.ValidationStatusChange)
                .CombineLatest())
                        .Switch()
                        .Select(
                states => states
                .Select(state => formatter.Format(state.Text))
                .FirstOrDefault(msg => !string.IsNullOrEmpty(msg)) ?? string.Empty);

            var updateObs = BindToView(vcObs, view, viewProperty)
                            .Select(_ => Unit.Default);

            return(new ValidationBinding(updateObs));
        }
        public static IDisposable BindValidation <TView, TViewModel>(
            this TView view,
            TViewModel viewModel,
            Expression <Func <TViewModel?, ValidationHelper> > viewModelHelperProperty,
            TextInputLayout viewProperty,
            IValidationTextFormatter <string>?formatter = null)
            where TView : IViewFor <TViewModel>
            where TViewModel : class, IReactiveObject, IValidatableViewModel
        {
            formatter ??= Locator.Current.GetService <IValidationTextFormatter <string> >() ??
            SingleLineFormatter.Default;

            return(ValidationBinding.ForValidationHelperProperty(
                       view,
                       viewModelHelperProperty,
                       (_, errorText) => viewProperty.Error = errorText,
                       formatter));
        }
示例#12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="IndeiTestViewModel"/> class.
 /// </summary>
 /// <param name="formatter">Validation text formatter.</param>
 public IndeiTestViewModel(IValidationTextFormatter <string> formatter)
     : base(ImmediateScheduler.Instance, formatter)
 {
 }
示例#13
0
 public DialogViewModel(IScheduler scheduler = null, IValidationTextFormatter <string> formatter = null) : base(scheduler, formatter)
 {
 }