C# 在目标不断变化的情况下使用ReactiveUI InvokeCommand扩展

C# 在目标不断变化的情况下使用ReactiveUI InvokeCommand扩展,c#,reactiveui,C#,Reactiveui,虽然下面的代码有效,但我不确定它是否是最佳实践。我想知道我是不是想得太多了 情况:下面的代码在我的主ViewModel构造函数中。ViewModel有一个属性MessageHandler,该属性上有一个名为ReceiveMessage的ReactiveCommand属性。ViewModel还有另一个属性ScannerViewModel,上面有一个RawMessage属性。我想使用ReactiveUI.InvokeCommand()扩展方法将RawMessage管道传输到ReceiveMessag

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

情况:下面的代码在我的主ViewModel构造函数中。ViewModel有一个属性
MessageHandler
,该属性上有一个名为
ReceiveMessage
ReactiveCommand
属性。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
disposables,因此可能不需要
.Scan
部分,或者可以做得更好

我尝试了
InvokeCommand
扩展的重载,该扩展允许您分配一个目标,但它似乎是静态的,或者我无法找到语法使其将
可观察的
作为目标:

 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);

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

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

 this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
     .InvokeCommand(this, t => t.MessageHandler.ReceiveMessage);
我把它倒过来看。我想这会达到我想要的

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