我使用Reactive UI进行MVVM WPF项目,当属性发生变化时我需要知道:
我有一个viewmodel(从ReactiveObject
派生),并在其上声明了一个属性:
private AccountHolderType _accountHolderType;
public AccountHolderType AccountHolderType
{
get { return _accountHolderType; }
set { this.RaiseAndSetIfChanged(ref _accountHolderType, value); }
}
在构造函数中,我尝试执行以下操作:
this.WhenAnyValue(vm => vm.AccountHolderType)
.Subscribe((old,curr) => { // DO SOMETHING HERE });
但是WhenAnyValue
方法没有这样的重载,并且Reactive文档非常缺乏。
我可以获得对简单WhenAnyValue
的访问权限,以便:
this.WhenAnyValue(vm => vm.AccountHolderType)
.Subscribe(val => { // DO SOMETHING HERE });
这让我可以观察更改并获得最新的更改,但我需要访问先前的值。
我知道我可以将其作为一个简单的属性来实现:
public AccountHolderType AccountHolderType
{
get { // }
set
{
var prev = _accountHolderType;
_accountHolderType = value;
// Do the work with the old and new value
DoSomething(prev, value);
}
}
但鉴于该项目正在使用Reactive UI,我希望成为" reactive-y"尽可能。
答案 0 :(得分:8)
这个怎么样:
this.WhenAnyValue(vm => vm.AccountHolderType)
.Buffer(2, 1)
.Select(b => new { Previous = b[0], Current = b[1] })
.Subscribe(t => {
//Logic using previous and new value for AccountHolderType
});
我认为你错过了这个直接的Buffer功能。
答案 1 :(得分:1)
类似的东西:
var previousValue = this.WhenAnyValue(vm => vm.AccountHolderType);
var currentValue = previousValue.Skip(1);
var previousWithCurrent = previousValue.Zip(currentValue, (prev, curr) => { /* DO SOMETHING HERE */ });