C# 观察两个反应列表上的ItemChanged
我有一个ViewModel,我想在其中监听对两个反应列表(Payments和AccountPayments)中的项目的更改。将实例化列表,并将ChangeTrackingEnabled设置为true:C# 观察两个反应列表上的ItemChanged,c#,reactiveui,C#,Reactiveui,我有一个ViewModel,我想在其中监听对两个反应列表(Payments和AccountPayments)中的项目的更改。将实例化列表,并将ChangeTrackingEnabled设置为true: this.Payments = new ReactiveList<transaction.PaymentViewModel>(); this.Payments.ChangeTrackingEnabled = true;` this.AccountPayments = new React
this.Payments = new ReactiveList<transaction.PaymentViewModel>();
this.Payments.ChangeTrackingEnabled = true;`
this.AccountPayments = new ReactiveList<AccountPaymentViewModel>();
this.AccountPayments.ChangeTrackingEnabled = true;`
虽然这可以很好地编译,但它似乎没有捕捉到更改。
我还尝试使用WhenyObservable:
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
本身不会更改,它是可观察的
第二种方法非常正确,但需要稍加修改<代码>当任何可观察对象要求所有可观察对象都是同一类型时。由于您对实际结果不感兴趣,您可以选择Unit
并将两者合并:
this.WhenAnyObservable(a => a.Payments.ItemChanged).Select(_ => Unit.Default)
.Merge(this.WhenAnyObservable(a => a.AccountPayments.ItemChanged).Select(_ => Unit.Default));
当任何可观察到时,您不能在中选择Unit.Default
,因为它重新写入此表达式以观察属性更改,以确保其具有最新的可观察到。如果Payments
和AccountPayments
都不会更改(即,它们是只读的),那么当任何可见的一起出现时,您可以忽略:
Payments.ItemChanged.Select(_ => Unit.Default)
.Merge(AccountPayments.ItemChanged.Select(_ => Unit.Default));
谢谢你的帮助,查尔斯。事实上,我错过了结尾部分(多么尴尬),然而,编译错误仍然存在。在发现我的第二个代码片段是正确的方法之后,我进行了更深入的研究。事实证明,这个问题是我在问题中没有提到的。这两个列表包含两种不同的类型。AccountPayment与Payment类不同。我有点傻。再次感谢您的代码审查,并为我指明了正确的方向。@StuartMiller。。。我的回答是这样的。虽然我承认我最初回答的时候确实错过了,但也许你没有看到编辑!哦,我没看过你的编辑。这正是我需要的,我不知道。非常感谢您的帮助。只需测试一下,就会遇到另一个问题。我得到一个运行时异常,类型为“System.NotSupportedException”,表示“索引表达式仅支持常量”。似乎是在我试图返回单位时发生的。默认值。@StuartMiller啊,你说得对WhenAny
设置属性更改的侦听器以跟踪其中表达式的更改,因此不支持执行任何花哨的操作。我会更新的。
this.WhenAnyObservable(a => a.Payments.ItemChanged).Select(_ => Unit.Default)
.Merge(this.WhenAnyObservable(a => a.AccountPayments.ItemChanged).Select(_ => Unit.Default));
Payments.ItemChanged.Select(_ => Unit.Default)
.Merge(AccountPayments.ItemChanged.Select(_ => Unit.Default));