【问题标题】:ReactiveUI - "reset" Changed of ReactiveObjectReactiveUI - ReactiveObject 的“重置”更改
【发布时间】:2020-05-02 18:05:58
【问题描述】:

我的 ViewModel 上有一个属性“CurrentCompany”,该属性本身继承自 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-object 上更改了一些内容,并且该按钮被启用。 我不知道的是:执行 SaveCompanyDTO-Task 后,我希望再次禁用该按钮。我怎样才能告诉 reactiveui 我的 CurrentCompany-object 没有改变并且又是新鲜的?我怎样才能做到这一点?

【问题讨论】:

  • 您的 canSaveCommand 实现始终选择 true。相反,您应该选择 Changed 的​​值。
  • "Changed" 不是布尔值,而是类型为 "IObservable>" EventArgs 告诉我已更改的属性的名称。这意味着当我更改名为“名称”的属性上的字母时,Changed-Event 会触发并告诉我“属性“名称”已更改”。但是当我保存我的记录时,我如何告诉我的 ReactiveObject 它应该重新开始监视更改?
  • 哦,我不使用 Changed(我不经常看到),而是在 canSaveCommand 基础的 company 类中有一个响应式 IsDirty 属性。

标签: reactive-programming system.reactive reactiveui


【解决方案1】:

感谢所有回答。

我终于找到了解决办法;不知道它是否优雅,但它有效! 首先,我在 ViewModel 上引入了另一个名为“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;
        });

【讨论】:

    【解决方案2】:

    我不知道的是:执行 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);
    

    如何告诉 reactiveui 我的 CurrentCompany 对象没有改变 又新鲜了?

    如果您总是想知道保存后 Company 对象是否未更改,我会在 CompanyDTO 类本身中添加一个属性,并将其用于 SaveCompanyCommand 中的canExceute

    【讨论】:

      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 2016-05-18
      • 2013-08-11
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多