2015-12-13 30 views
0

有沒有一種乾淨的方式來強制一個WhenAnyValue重新評估自己,併爲其訂閱者調用onNext?Force WhenAnyValue to re-evaluation

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. 
    } 

感謝:-)

回答

2

雖然你的解決方案與主題將工作,我相信你可以做得更好,那。我假設你提交的代碼是從視圖模型中獲取的。鑑於這樣的假設:

1)SaveModel should be a Command

2)IsDirty should be an output property

如果應用此改變,你最終沒有額外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這一事實持有與您的主題相同的信息。

+0

乾杯人 - 我明白你在那裏做了什麼。這更乾淨。謝謝! :-) –

0

我想這應該很容易。我今天早上一定是「預先喝咖啡」。

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()); 
}