Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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# ReactiveUI:IObservable.Transform()不转发通知_C#_Wpf_Reactiveui - Fatal编程技术网

C# ReactiveUI:IObservable.Transform()不转发通知

C# ReactiveUI:IObservable.Transform()不转发通知,c#,wpf,reactiveui,C#,Wpf,Reactiveui,在下面的剪贴画中,似乎transform(x=>x.Bar.Baz)仅在添加或删除sl2中的项目时转发更改,而在Baz的th值更改时不转发更改。这是预期的行为吗?如何更改它,使所有修改都能在转换后的中找到 SourceList<FooClass> sl2 = new SourceList<FooClass>(); sl2.Connect() .Transform(x => x.Bar.Baz) .Bind(out ReadOn

在下面的剪贴画中,似乎
transform(x=>x.Bar.Baz)
仅在添加或删除
sl2
中的项目时转发更改,而在
Baz
的th值更改时不转发更改。这是预期的行为吗?如何更改它,使所有修改都能在转换后的
中找到

SourceList<FooClass> sl2 = new SourceList<FooClass>();    
sl2.Connect()
        .Transform(x => x.Bar.Baz)
        .Bind(out ReadOnlyObservableCollection<String> transformed)
        .Subscribe( x=> { Console.WriteLine("CHANGE from Subscribe"); } );
请注意: (1) 在
transformed
中,世界的改变->空间永远不会完成。在
sl2
中完成此更改

(2) CollectionChangedEvent仅在添加in-Item added后触发

我的问题:

如何确保
transform()
设置正确的通知

更新

根据下面的Funk答案,应通过以下方式解决此问题:

sl2.Connect()
   .AutoRefresh(x => x.Bar.Baz)
   .Transform(x => x.Bar.Baz)
   ...
但是,这不会改变输出

这是预期的行为吗

是的。根据
ObservableCollection
只监视对集合(或流)的更改

当然,你想要的是很普通的,幸运的是,很容易实现。从反应UI:

DynamicData支持对实现INotifyPropertyChanged接口-ReactiveObjects的类进行更改跟踪。例如,如果要对更改对象集合中的每个元素执行WhenyValue,请使用AutoRefresh()DynamicData运算符

只需将
AutoRefresh
操作符添加到管道中,并使用接受标志的
Transform
操作符重载将
transformOnRefresh
设置为true

sl2.Connect()
   .AutoRefresh(x => x.Bar.Baz)
   .Transform(x => x.Bar.Baz, true)
   ...

注意:为了帮助调试,您可以分解
IChangeSet
及其
Change
s


您是否尝试了WhenAnyPropertyChanged
扩展方法?我在这里尝试过:基本上,'BarClass'会触发通知,以防'Baz'发生更改。然而,我更喜欢使用“transform()”的解决方案,因为我需要使用进一步的步骤,如过滤和排序。你好,Funk!谢谢你的回答。你的解释听起来很合理。我试过了,但不幸的是我的输出没有改变。有什么想法吗?也许也和这个问题有关:。。。(尽管它似乎在Github上关闭了)?这看起来是正确的解决方案。但是,默认情况下,transform操作符不响应刷新通知,您需要选择该选项。通过在GitHub repo中使用“Transform(x=>x.Bar.Baz,true)”@BerndGit,您没有在
.AutoRefresh(x=>x.Bar.Baz)
的末尾添加
.Baz
。结合
transformOnRefresh:true
它将给出所需的结果。现在正在工作。谢谢你们芬克和罗兰野鸡!
sl2.Connect()
   .AutoRefresh(x => x.Bar.Baz)
   .Transform(x => x.Bar.Baz)
   ...
sl2.Connect()
   .AutoRefresh(x => x.Bar.Baz)
   .Transform(x => x.Bar.Baz, true)
   ...
sl2.Connect()
   .AutoRefresh(x => x.Bar.Baz)
   .Transform(x => x.Bar.Baz, true)
   .Do(x =>
   {
       foreach (var c in x) Console.WriteLine($"sl2 ticks {c.Item.Current}");
   })
   ...