Lapish72
@Lapish72

Валидация с помощью ReactiveUI.Validation?

Доброй ночи! Создаю клиент-серверное приложение для себя и столкнулся с проблемой валидации с помощью ReactiveUI.Validation. А именно проблема заключается в том, что если в ViewModel есть одно свойство, то валидация хоть и работает, но через 2 изменения свойства. Как только я добавляю 2е свойство, то все работает прекрасно.

Почитал документацию, нашел 1 пример и создал тестовый проект.

MainWindowViewModel.cs
public class MainWindowViewModel : ReactiveValidationObject<MainWindowViewModel>
{
    [Reactive]
    public string FirstName { get; set; } = string.Empty;

    public MainWindowViewModel()
    {
        this.ValidationRule(viewmodel => viewmodel.FirstName,
            fs => !fs.Contains(" "),
            "Не может быть пробелов");

        this.ValidationRule(viewModel => viewModel.FirstName,
            firstName => !string.IsNullOrWhiteSpace(firstName), 
            "Имя не может быть пустым");
    }
}


MainWindow.xaml
<reactiveui:ReactiveWindow 
        x:Class="ReactiveValidation.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:vms="clr-namespace:ReactiveValidation.ViewModels"
        x:TypeArguments="vms:MainWindowViewModel"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:reactiveui="http://reactiveui.net"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" >

    <StackPanel>
        <TextBox Text="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                 md:HintAssist.Hint="Имя" Style="{DynamicResource MaterialDesignFloatingHintTextBox}" Margin="30"/>
    </StackPanel>
</reactiveui:ReactiveWindow>


MainWindow.xaml.cs
public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
{
    public MainWindow()
    {
        InitializeComponent();
        ViewModel = new MainWindowViewModel();
        this.WhenActivated(disposableRegistration =>
        {
        });
    }
}


App.xaml.cs
public partial class App
{
    protected override Window CreateShell()
    {
        return Container.Resolve<MainWindow>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {

    }
}


Валидация работает, но спустя 2 действия. Например, я ввожу "1", "2", " " и никакой ошибки не появится. Но, если я введу сейчас любой символ, то сразу появится ошибка. Почему такое происходит?

Однако, если я добавлю еще одно свойство, которое никак не связано с View, а к свойству ValidationRule, то все чудесным образом работает. То есть, после каждого изменения свойства проверка идет сразу, а не через 2 изменения.

Магия
public class MainWindowViewModel : ReactiveValidationObject<MainWindowViewModel>
{
    [Reactive]
    public string FirstName { get; set; } = string.Empty;

    [Reactive]
    public string Test { get; set; }

    public MainWindowViewModel()
    {
        this.ValidationRule(viewmodel => viewmodel.FirstName,
            fs => !fs.Contains(" "),
            "Не может быть пробелов");

        this.ValidationRule(viewModel => viewModel.FirstName,
            firstName => !string.IsNullOrWhiteSpace(firstName), 
            "Имя не может быть пустым");

        this.ValidationRule(
            vm => vm.Test,
            test => !string.IsNullOrWhiteSpace(test),
            "567");
    }
}
  • Вопрос задан
  • 261 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы