Реактивное нажатие RaiseAndSetIfChanged при потере фокуса на текстовом поле

#mvvm #reactiveui

#mvvm #reactiveui

Вопрос:

Я использую ReactiveCommand:

 LoginCommand = new ReactiveCommand(this.WhenAny(x => x.UserName, x => x.Password, (r, g) => !string.IsNullOrEmpty(r.Value)  amp;amp;!string.IsNullOrEmpty(g.Value)));            
LoginCommand.Subscribe(async _ =>
{
var user = await _authenticationService.AuthenticateUser(_userName, _password);
                if (user.Error != null)
                {
                    MessageBox.Show("The user was not found. Please try again!", "User Not Found", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                    return;
                }               
                screen.Router.Navigate.Execute(new MainViewModel(screen));
            });
  

И имя пользователя, поле пароля для привязки:

 public string Password
{
   get { return _password; }
   set { this.RaiseAndSetIfChanged(ref _password, value); }
}   
  

И текстовое поле для этой привязки к:

  <TextBox x:Name="txtPassword" Text="{Binding Password}" Grid.Column="1" Grid.Row="2" Margin="3,3,0,3" MinWidth="100" HorizontalAlignment="Left" Width="10" Height="30"/>
  

Этот код работает, но когда я теряю фокус на текстовом поле. Есть ли какой-нибудь правильный способ сделать это, когда я начинаю писать в текстовом поле с помощью ReactiveUI.

Ответ №1:

Используйте свойство UpdateSourceTrigger. Как следует из названия, это означает, что всякий раз, когда происходит изменение в свойстве Text текстового поля, срабатывает RaiseAndSetIfChanged.

 <TextBox x:Name="txtPassword" Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="2" Margin="3,3,0,3" MinWidth="100" HorizontalAlignment="Left" Width="10" Height="30"/>