强制 WhenAnyValue 重新计算

本文关键字:计算 新计算 WhenAnyValue 强制 | 更新日期: 2023-09-27 18:26:34

有没有一种干净的方法来强制WhenAnyValue重新评估自己并为订阅者调用Next?

    protected override IObservable<bool> IsDirty() {
        return this.WhenAnyValue 
        (x => x.Firstname,
         x => x.LastName
        (f1, f2) => 
        f1 != this.Model.FirstName
        || f2 != this.Model.LastName
        );
    }
    protected override void SaveModel() {
        Model.FirstName = this.FirstName;
        Model.LastName = this.LastName;
        Save(Model); 
        // want to force IsDirty to re-evaluate here and return false.
    }

谢谢 :-(

强制 WhenAnyValue 重新计算

虽然你的主题解决方案会起作用,但我相信你可以做得更好。我假设您提供的代码取自视图模型。鉴于该假设:

1(SaveModel应该是一个命令

2( IsDirty应该是输出属性

如果应用此更改,则最终会得到一个没有额外Subject的代码(耶!

// in class
public ReactiveCommand<Unit> SaveCommand { get; }
private readonly ObservableAsPropertyHelper<bool> _isDirty;
public bool IsDirty { get { return _isDirty.Value; } }

// in constructor
this.SaveCommand = ReactiveCommand.CreateAsyncTask(_ => 
{
    Model.FirstName = this.FirstName;
    Model.LastName = this.LastName;
    Save(Model); // this could be an async method
    return Task.FromResult(Unit.Default);
});
this.WhenAnyValue(
    vm => vm.Firstname,
    vm => vm.LastName,
    (f1, f2) => Unit.Default)
    .Select(_ => this.FirstName != this.Model.FirstName 
              || this.LastName != this.Model.LastName)
    .Merge(this.SaveCommand.select(x => false))
    .ToProperty(this, vm => vm.IsDirty, out _isDirty);

这利用了这样一个事实,即ReactiveCommand本身实现了IObservable持有与您的主题相同的信息。

我认为这应该很容易。我今天早上一定是"预咖啡"。

protected Subject<Unit> Saved = new Subject<Unit>();
protected override IObservable<bool> IsDirty() {
        return this.WhenAnyValue 
        (x => x.Firstname,
         x => x.LastName
        (f1, f2) => 
        f1 != this.Model.FirstName
        || f2 != this.Model.LastName
        ).Merge(Saved.Select(x => false));
}
protected override void SaveModel() {
    Model.FirstName = this.FirstName;
    Model.LastName = this.LastName;
    Save(Model); 
    this.Saved.OnNext(new Unit());
}