在 WPF MVVM 中使用 ReactiveUI 获取 属性 更改的先验值
Getting prior value on change of property using ReactiveUI in WPF MVVM
我正在为 MVVM WPF 项目使用 Reactive UI,当 属性 发生变化时,我需要知道:
- 更改前的值
- 新值(即变化)
我有一个视图模型(派生自 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"。
类似于:
var previousValue = this.WhenAnyValue(vm => vm.AccountHolderType);
var currentValue = previousValue.Skip(1);
var previousWithCurrent =
previousValue.Zip(currentValue, (prev, curr) => { /* DO SOMETHING HERE */ });
这个怎么样:
this.WhenAnyValue(vm => vm.AccountHolderType)
.Buffer(2, 1)
.Select(b => (Previous: b[0], Current: b[1]))
.Subscribe(t => {
//Logic using previous and new value for AccountHolderType
});
我想你错过了这个简单的 Buffer 函数。
我正在为 MVVM WPF 项目使用 Reactive UI,当 属性 发生变化时,我需要知道:
- 更改前的值
- 新值(即变化)
我有一个视图模型(派生自 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"。
类似于:
var previousValue = this.WhenAnyValue(vm => vm.AccountHolderType);
var currentValue = previousValue.Skip(1);
var previousWithCurrent =
previousValue.Zip(currentValue, (prev, curr) => { /* DO SOMETHING HERE */ });
这个怎么样:
this.WhenAnyValue(vm => vm.AccountHolderType)
.Buffer(2, 1)
.Select(b => (Previous: b[0], Current: b[1]))
.Subscribe(t => {
//Logic using previous and new value for AccountHolderType
});
我想你错过了这个简单的 Buffer 函数。