强制 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.
}
谢谢 :-(
虽然你的主题解决方案会起作用,但我相信你可以做得更好。我假设您提供的代码取自视图模型。鉴于该假设:
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());
}