使用具有更改目标的ReactiveUI InvokeCommand扩展

本文关键字:ReactiveUI InvokeCommand 扩展 目标 | 更新日期: 2023-09-27 18:28:18

虽然下面的代码有效,但我不确定这是否是最佳实践。我想知道我是不是想得太多了。

情境:下面的代码在我的主ViewModel构造函数中。ViewModel的属性MessageHandler上有一个名为ReceiveMessageReactiveCommand属性。ViewModel有另一个属性ScannerViewModel,上面有一个RawMessage属性。我想使用ReactiveUI .InvokeCommand()扩展方法将RawMessage管道传输到ReceiveMessage。我之所以想要这个,是因为它为我检查.CanExecute很方便。即使MessageHandler(甚至可能是ReceiveMessage)和ScannerViewModel可能会更改,也应该发生这种情况。

 this.WhenAnyValue(t => t.MessageHandler.ReceiveMessage)
     .Select(cmd => 
             this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
                 .InvokeCommand(cmd))
     .Scan(Disposable.Empty,
             (acc, n) =>
                        {
                            acc.Dispose();
                            return n;
                        })
     .Subscribe();

因此,以上内容似乎有效。我不太确定在进行过程中是否需要处理以前的InvokeCommand一次性用品,所以可能.Scan部分是不需要的,或者可能可以做得更好。

我尝试了InvokeCommand扩展的重载,它可以让你分配一个目标,但它似乎是静态的,或者我无法找出使它以Observable为目标的语法:

 this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
     .InvokeCommand(MessageHandler, m => m.ReceiveMessage);

这将跟随RawMessage,因为它的父级发生了更改,但如果MessageHandler发生了更改则会中断。这并不能编译:

 this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
     .InvokeCommand(this.WhenAnyValue(t => t.MessageHandler), m => m.ReceiveMessage);

我并不反对保留我所拥有的,除非有人发现它有缺陷。我正在寻找一种可能不那么冗长、更容易遵循的东西。

使用具有更改目标的ReactiveUI InvokeCommand扩展

不要问我为什么不想这么做:

 this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
     .InvokeCommand(this, t => t.MessageHandler.ReceiveMessage);

我倒过来看。我想这会达到我想要的。

我一次又一次地发现,这个框架已经为我发现的问题找到了解决方案——这只是我自己摸索的问题。