在WPF MVVM中使用ReactiveUI获取属性更改的优先值

时间:2015-03-17 13:30:08

标签: c# wpf reactiveui

我使用Reactive UI进行MVVM WPF项目,当属性发生变化时我需要知道:

  1. 更改前的值
  2. 新值(即更改)
  3. 我有一个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"尽可能。

2 个答案:

答案 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 */ });