使用具有更改目标的ReactiveUI InvokeCommand扩展
本文关键字:ReactiveUI InvokeCommand 扩展 目标 | 更新日期: 2023-09-27 18:28:18
虽然下面的代码有效,但我不确定这是否是最佳实践。我想知道我是不是想得太多了。
情境:下面的代码在我的主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
一次性用品,所以可能.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);
我并不反对保留我所拥有的,除非有人发现它有缺陷。我正在寻找一种可能不那么冗长、更容易遵循的东西。
不要问我为什么不想这么做:
this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
.InvokeCommand(this, t => t.MessageHandler.ReceiveMessage);
我倒过来看。我想这会达到我想要的。
我一次又一次地发现,这个框架已经为我发现的问题找到了解决方案——这只是我自己摸索的问题。