WPF ReactiveValidation ошибка отображается через раз
Изучаю фреймворк Reactiveui, а в частности Validation. Заметил такой баг(или я что-то не так делаю). Создал тестовый проект, модель, добавил к ней валидацию. Добавил кнопку, доступность которой зависит от валидности модели. Все прекрасно работает, но как только заполнены все свойства, а для теста я их сделал 3, то при неправильно введенных значениях ошибки во View отображаются через 1 раз.
Например: Есть 3 свойства: Username, Age и Password. Я их заполняю правильно и IsValid == true. Но, как только я добавлю пробел к Username(тем самым нарушу его валидность), то кнопка сразу станет недоступной как и должна, а вот никакой ошибки под полем с именем я не увижу. Для этого мне придется еще раз ввести любой символ.
Решение сделано через шаблон Prism на .net core 3.1. Использовал:
- MaterialDesignThemes
- Prism.Unity
- ReactiveUi.Fody
- ReactiveUI.Validation
- ReactiveUI.WPF
Все библиотеки последних версий.
Код:
User.cs
public class User : ReactiveValidationObject<User>
{
[Reactive]
public string Username { get; set; } = "asd";
[Reactive]
public string Age { get; set; } = string.Empty;
[Reactive]
public string Password { get; set; } = string.Empty;
public User()
{
this.ValidationRule(
x => x.Username,
username => !string.IsNullOrWhiteSpace(username),
"Имя пользователя не может быть пустым");
this.ValidationRule(
x => x.Username,
username => !username.Contains(" "),
"Имя не должно содержать пробелы");
this.ValidationRule(
x => x.Age,
age => !string.IsNullOrWhiteSpace(age),
"Тратата");
this.ValidationRule(
x => x.Password,
pass => !string.IsNullOrWhiteSpace(pass),
"Пароль не может быть пустым");
}
}
LoginViewModel.cs
public class LoginViewModel : ReactiveObject
{
[Reactive]
public User User { get; set; }
public ReactiveCommand<Unit, Unit> Connect { get; }
{ get; set; }
public LoginViewModel()
{
User = new User();
Connect = ReactiveCommand.Create(()=>{}, User.IsValid());
}
}
LoginView.xaml
<rxui:ReactiveUserControl x:Class="ReactiveValidation.Views.LoginView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vms="clr-namespace:ReactiveValidation.ViewModels"
x:TypeArguments="vms:LoginViewModel"
xmlns:rxui="http://reactiveui.net"
xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
<StackPanel>
<TextBox Text="{Binding User.Username, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
md:HintAssist.Hint="Имя пользователя" Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<TextBox Text="{Binding User.Age, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
md:HintAssist.Hint="Возраст" Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<TextBox Text="{Binding User.Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
md:HintAssist.Hint="Пароль" Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<Button Content="Вход" Command="{Binding Connect}" Width="150"/>
</StackPanel>
</rxui:ReactiveUserControl>