ReactiveUI - «сброс», измененный для ReactiveObject - PullRequest
0 голосов
/ 02 мая 2020

У меня есть свойство "CurrentCompany" в моей ViewModel, само свойство наследуется от ReactiveObject и объявляется как OAPH:

private ObservableAsPropertyHelper<CompanyDTO> _currentCompany;
public CompanyDTO CurrentCompany => _currentCompany.Value;

Затем у меня есть ReactiveCommand, которая вызывает асинхронную задачу для сохранения изменений моего объект:

SaveCompanyCommand = ReactiveCommand.CreateFromTask(SaveCompanyDTO, canSaveCommand);

"canSaveCommand" определяется следующим образом:

var canSaveCommand = (this)
    .WhenAnyObservable(vm => vm.CurrentCompany.Changed)
    .Select(_ => true);

Все это работает, как и ожидалось, кнопка, к которой привязана моя SaveCompanyCommand, отключена, я что-то изменяю на моем CurrentCompany-объекте, и кнопка становится активной. Чего я не знаю: после выполнения SaveCompanyDTO-Task я хочу снова отключить кнопку. Как я могу сказать реактивному, что мой CurrentCompany-объект неизменен и снова fre sh? Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Спасибо за все ответы.

Я наконец нашел решение; не знаю, элегантно ли это, но это работает! Во-первых, я ввел еще одно логическое свойство в моей модели представления с именем «HasChanges». «CanSaveCommand» реагирует на каждое изменение этого свойства:

IObservable<bool> canSaveCommand = (this)
    .WhenAnyValue(vm => vm.HasChanges);

Затем я наблюдаю за изменениями в моем объекте:

_ = (this)
    .WhenAnyObservable(vm => vm.CurrentCompany.Changed)
    .Subscribe(c =>
    {
        HasChanges = true;
    });

И после выполнения моей ReactiveCommand я снова сбрасываю HasChanges в false :

SaveCompanyCommand = ReactiveCommand.CreateFromTask(SaveCompanyDTO, canSaveCommand);
 _ = SaveCompanyCommand.Subscribe(c =>
        {
            HasChanges = false;
        });

Будьте в безопасности и здоровы!

0 голосов
/ 03 мая 2020

Чего я не знаю: после выполнения SaveCompanyDTO-Task я хочу снова отключить кнопку.

Если вы хотите отключить кнопку только после выполнения команды, вы можно попробовать использовать тему:

Subject<bool> canExecuteSubject = new Subject<bool>();
SaveCompanyCommand = ReactiveCommand.CreateFromTask(SaveCompanyDTO, canExecuteSubject);

Observable.Merge(
    // enable button after every change
    this.WhenAnyObservable(vm => vm.CurrentCompany.Changed).Select(_ => true),
    // disable button after execution
    SaveCompanyCommand.Select(_ => false))
.Subscribe(canExecuteSubject);

Как я могу сказать реактиву, что мой объект CurrentCompany не изменился и снова fre sh?

Если вы всегда хотите чтобы узнать, не изменился ли объект Company после сохранения, я бы добавил свойство к самому классу CompanyDTO и использовал бы его для canExceute в SaveCompanyCommand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...