C# 检索ReactiveList的Change observable中的省略对象
我有几个对象,每个对象都包含一个ReactiveList子对象,对于这些子对象的更改,我想执行一些逻辑。父对象是动态的,也在反应列表中。基本上我是这样做的:C# 检索ReactiveList的Change observable中的省略对象,c#,system.reactive,reactiveui,C#,System.reactive,Reactiveui,我有几个对象,每个对象都包含一个ReactiveList子对象,对于这些子对象的更改,我想执行一些逻辑。父对象是动态的,也在反应列表中。基本上我是这样做的: var parents = new ReactiveList<Parent>(); parents.Add(new Parent() { Id = 1, Children = new ReactiveList<Child>() }; parents.Add(new Parent() { Id = 2, Childre
var parents = new ReactiveList<Parent>();
parents.Add(new Parent() { Id = 1, Children = new ReactiveList<Child>() };
parents.Add(new Parent() { Id = 2, Children = new ReactiveList<Child>() };
parents.Changed
.SelectMany(_ => parents.Select(x => x.Children.Changed).Merge())
.Subscribe(x => {
// Some of the parent's children have changed. But which parent?
});
// trigger Changed event
parents[1].Children.Add(new Child());
问题是,我需要知道这是为哪一位家长发生的。如果我至少有正在更改的集合,我可以检索父集合。但是我已经查看了传递下来的NotifyCollectionChangedEventArgs,其中没有任何有用的内容
因此,除了手动循环通过家长并订阅每一个,这在我看来不是很简单,可能会带来一系列泄漏问题,还有一个优雅的解决方案吗?您没有给我们提供太多代码,但这对您有用吗
var query =
from parent in parents.Changed
from child in parent.Children.Changed.Merge()
select new
{
parent,
child,
};
query
.Subscribe((p, c) =>
{
});
只需按照@Enigmativity的建议保存家长即可:
parents.Changed
.SelectMany(_ => parents
.Select(parent => parent.Children.Changed.Select(childEvent =>
new { parent, childEvent}))
.Merge())
.Subscribe(x => {
// x.parent / x.childEvent
});
<>请注意,每当父列表更改时,您的代码将涉及大量订阅,所有的订阅都是重新生成的,也许您应该考虑使用RealVistReor的支持。如果可能的话,因为它不会告诉您哪个孩子改变了我已经更新了示例,使其更加详细。我对LINQ语法非常陌生,所以可能我弄错了什么,但是第3行中的父变量的类型是NotifyCollectionChangedEventArgs,因此我无法从中选择子变量。@phreezie-您没有提供任何类定义,所以我不知道涉及的类型。你能发布一个完整的代码示例吗?这样我就可以正确地得到代码了。父级只需要int-Id和ReactiveList子级。儿童班是无关紧要的。非常感谢您的输入,但我将接受下面@Gluck的答案。干杯@phreezie-你知道Gluck的答案实际上和我的一样-他只是把.Merge放在一个不同的位置,变量的名称稍有不同?我试过你的答案,但可能是.Merge放在一个不同的位置使得Gluck的答案有效而你的答案无效?如果我的第一篇未经编辑的文章不够精确,我很抱歉。谢谢,这就是我要找的!据我所知,更改跟踪不会嵌套,这意味着它将检测子项是否被重新分配,但不会检测子项中的某些内容是否发生更改,即添加/删除的项目。我错了吗?是的,您可能能够将更改的子事件转发/路由到您的父事件上,但最终您可能会很好地使用这种方法,并且如果perf作为一个问题出现,您可以在其他地方重新编写流的更优化版本,而不必进行太多更改。好的,谢谢!现在来看看真正的后续行动:有了这个代码,当父母改变时,孩子的订阅会得到适当的处理,对吗?