c# - 在 WPF MVVM 中使用 ReactiveUI 获取属性更改的先验值

标签 c# wpf reactiveui

我正在为 MVVM WPF 项目使用 Reactive UI,当属性更改时我需要知道:

  1. 变化前的值
  2. 新值(value)(即变化)

我有一个 View 模型(派生自 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,我希望尽可能“响应式”。

最佳答案

这个怎么样:

 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功能。

关于c# - 在 WPF MVVM 中使用 ReactiveUI 获取属性更改的先验值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29100381/

相关文章:

c# - 绑定(bind) WindowStartupLocation

c# - 图像文件副本,正在被另一个进程使用

c# - ReactiveUI 中的 TestScheduler 异步方法死锁

c# - 如何从 Azure 容器中的 blob 获取所有 URL 的列表?

c# - 避免在数字上下对话框中按 enter 时发出蜂鸣声

c# - NUnit 测试运行顺序

c# - 如何从 mySql 填充 DataGrid

.net - 为什么 ObservableForProperty 上的 ReactiveUI 的 ToProperty 会导致 F# 中的 FailInit

mvvm - Xamarin表格: For what kind of projects is Reactive UI preferable?

c# - n元组的匹配序列