观察两个 ReactiveLists 上的 ItemChanged
Observe for ItemChanged on two ReactiveLists
我有一个 ViewModel,我想在其中监听两个 ReactiveLists、Payments 和 AccountPayments 中项目的更改。列表已实例化且 ChangeTrackingEnabled 设置为 true:
this.Payments = new ReactiveList<transaction.PaymentViewModel>();
this.Payments.ChangeTrackingEnabled = true;`
this.AccountPayments = new ReactiveList<AccountPaymentViewModel>();
this.AccountPayments.ChangeTrackingEnabled = true;`
然后,在我的 ViewModel 中定义,我有一个只读的 ObservableAsPropertyHelper 属性:
readonly ObservableAsPropertyHelper<decimal> _totalPayments;
public decimal TotalPayments { get { return _totalPayments.Value; } }
我的意图是在两个列表中的任何这些项目发生变化时设置 TotalPayments。我尝试使用 WhenAny:
this.WhenAny(vm => vm.Payments.ItemChanged,
vm => vm.AccountPayments.ItemChanged,
(a, b) => a.Sender.Payments
.Where(x => x.Amount.HasValue).Sum(x => x.Amount.Value)
+ b.Sender.AccountPayments
.Where(x => x.Amount.HasValue).Sum(x => x.Amount.Value))
.ToProperty(this, vm => vm.TotalPayments, out _totalPayments);
虽然编译得很好,但它似乎没有捕捉到变化。
我也尝试使用 WhenAnyObservable:
this.WhenAnyObservable(
vm => vm.Payments.ItemChanged,
vm => vm.AccountPayments.ItemChanged)
.Select(_ =>
this.Payments.Where(x => x.Amount.HasValue)
.Sum(x => x.Amount.Value)
+ this.AccountPayments.Where(x => x.Amount.HasValue)
.Sum(x => x.Amount.Value))
.ToProperty(this, vm => vm.TotalPayments, out _totalPayments);
但这不会编译。
有没有办法完成我想做的事情?任何帮助将不胜感激。
第一个不会工作,因为它正在观察 属性 变化并且 ItemChanged
本身不会改变,它是一个可观察的。
第二个基本正确,但需要稍作修改。 WhenAnyObservable
要求所有可观察对象都是同一类型。由于您对实际结果不感兴趣,您可以 select Unit
并将两者合并:
this.WhenAnyObservable(a => a.Payments.ItemChanged).Select(_ => Unit.Default)
.Merge(this.WhenAnyObservable(a => a.AccountPayments.ItemChanged).Select(_ => Unit.Default));
您不能在 WhenAnyObservable
中 select Unit.Default
,因为它会重写此表达式以观察 属性 更改以确保它具有最新的可观察值。如果 Payments
和 AccountPayments
都不会改变(即它们是只读的),您可以完全省略 WhenAnyObservable
:
Payments.ItemChanged.Select(_ => Unit.Default)
.Merge(AccountPayments.ItemChanged.Select(_ => Unit.Default));
我有一个 ViewModel,我想在其中监听两个 ReactiveLists、Payments 和 AccountPayments 中项目的更改。列表已实例化且 ChangeTrackingEnabled 设置为 true:
this.Payments = new ReactiveList<transaction.PaymentViewModel>();
this.Payments.ChangeTrackingEnabled = true;`
this.AccountPayments = new ReactiveList<AccountPaymentViewModel>();
this.AccountPayments.ChangeTrackingEnabled = true;`
然后,在我的 ViewModel 中定义,我有一个只读的 ObservableAsPropertyHelper 属性:
readonly ObservableAsPropertyHelper<decimal> _totalPayments;
public decimal TotalPayments { get { return _totalPayments.Value; } }
我的意图是在两个列表中的任何这些项目发生变化时设置 TotalPayments。我尝试使用 WhenAny:
this.WhenAny(vm => vm.Payments.ItemChanged,
vm => vm.AccountPayments.ItemChanged,
(a, b) => a.Sender.Payments
.Where(x => x.Amount.HasValue).Sum(x => x.Amount.Value)
+ b.Sender.AccountPayments
.Where(x => x.Amount.HasValue).Sum(x => x.Amount.Value))
.ToProperty(this, vm => vm.TotalPayments, out _totalPayments);
虽然编译得很好,但它似乎没有捕捉到变化。 我也尝试使用 WhenAnyObservable:
this.WhenAnyObservable(
vm => vm.Payments.ItemChanged,
vm => vm.AccountPayments.ItemChanged)
.Select(_ =>
this.Payments.Where(x => x.Amount.HasValue)
.Sum(x => x.Amount.Value)
+ this.AccountPayments.Where(x => x.Amount.HasValue)
.Sum(x => x.Amount.Value))
.ToProperty(this, vm => vm.TotalPayments, out _totalPayments);
但这不会编译。 有没有办法完成我想做的事情?任何帮助将不胜感激。
第一个不会工作,因为它正在观察 属性 变化并且 ItemChanged
本身不会改变,它是一个可观察的。
第二个基本正确,但需要稍作修改。 WhenAnyObservable
要求所有可观察对象都是同一类型。由于您对实际结果不感兴趣,您可以 select Unit
并将两者合并:
this.WhenAnyObservable(a => a.Payments.ItemChanged).Select(_ => Unit.Default)
.Merge(this.WhenAnyObservable(a => a.AccountPayments.ItemChanged).Select(_ => Unit.Default));
您不能在 WhenAnyObservable
中 select Unit.Default
,因为它会重写此表达式以观察 属性 更改以确保它具有最新的可观察值。如果 Payments
和 AccountPayments
都不会改变(即它们是只读的),您可以完全省略 WhenAnyObservable
:
Payments.ItemChanged.Select(_ => Unit.Default)
.Merge(AccountPayments.ItemChanged.Select(_ => Unit.Default));