Отключить и включить кнопку при изменении текстового поля с ReactiveUI - PullRequest
0 голосов
/ 03 июля 2018

Я новичок в реактивном программировании, а также новичок в использовании ReactiveUI. поэтому мне нужна небольшая помощь.

Я работаю над проектом, мы используем Xamarin-iOS для платформы iOS.

У меня есть простой Login ViewController, где я хочу сразу включить кнопку, когда состояние TextField изменится.

У меня есть эти поля.

        private string user;
        private string password;
        private ReactiveCommand<Unit,bool> loginCommand;
        private ReactiveCommand<Unit,Unit> canselCommand;

И я использую this.WhenAnyValue метод

var canLogin = this.WhenAnyValue(x => x.user, x => x.password, (userName, password) =>
                                              !string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(password));

            this.loginCommand = ReactiveCommand.CreateFromObservable(
            () =>
               Observable
                .Return(this.passwordTextField.Text == "Tornike"))
                .Delay(TimeSpan.FromSeconds(1.5))
                .TakeUntil(this.canselCommand);

Где user и password являются частными строковыми полями. А также у меня есть passwordTextField и userNameTextField UILabels на интерфейсе пользователя.

Везде ошибки красной линии, и я немного напуган.

Так, как я могу просто включить кнопку, когда textFields изменится? Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вам необходимо создать свойства для использования метода расширения WhenAnyValue:

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

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

А в команде инициализация:

this.loginCommand = ReactiveCommand.CreateFromObservable(
        () =>
           Observable
            .Return(this.passwordTextField.Text == "Tornike"))
            .Delay(TimeSpan.FromSeconds(1.5))
            .TakeUntil(this.canselCommand),
canExecute: canLogin);

Используйте имя пользователя и пароль в полях WhenAnyValue вместо имени пользователя и пароля. Кроме того, используйте эти свойства в своем коде и в привязке (для TextFields).

0 голосов
/ 03 июля 2018

canLogin должен быть вторым аргументом, переданным методу CreateFromObservable. Первый аргумент должен быть Func<IObservable<bool>>. Это должно скомпилировать:

this.loginCommand = ReactiveCommand.CreateFromObservable(
() =>
    Observable
    .Return(this.passwordTextField.Text == "Tornike")
    .Delay(TimeSpan.FromSeconds(1.5))
    .TakeUntil(this.canselCommand), canLogin);

Но для IObservable<bool> для создания новых значений и обновления состояния команды при каждом изменении user или password необходимо реализовать user и password в качестве свойств и вызвать событие PropertyChanged всякий раз, когда они устанавливаются на новое значение, например:

public string User
{
    get { return user;}
    set { this.RaiseAndSetIfChanged(ref user, value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...