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}");
})
...