Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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# 检索ReactiveList的Change observable中的省略对象_C#_System.reactive_Reactiveui - Fatal编程技术网

C# 检索ReactiveList的Change observable中的省略对象

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

我有几个对象,每个对象都包含一个ReactiveList子对象,对于这些子对象的更改,我想执行一些逻辑。父对象是动态的,也在反应列表中。基本上我是这样做的:

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作为一个问题出现,您可以在其他地方重新编写流的更优化版本,而不必进行太多更改。好的,谢谢!现在来看看真正的后续行动:有了这个代码,当父母改变时,孩子的订阅会得到适当的处理,对吗?