Доброй ночи! Создаю клиент-серверное приложение для себя и столкнулся с проблемой валидации с помощью 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");
}
}