Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 观察两个反应列表上的ItemChanged_C#_Reactiveui - Fatal编程技术网

C# 观察两个反应列表上的ItemChanged

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

我有一个ViewModel,我想在其中监听对两个反应列表(Payments和AccountPayments)中的项目的更改。将实例化列表,并将ChangeTrackingEnabled设置为true:

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));