【发布时间】:2014-10-28 22:46:21
【问题描述】:
虽然以下代码有效,但我不确定这是最佳做法。我想知道我是否过度考虑了这种情况。
情况:下面的代码在我的主 ViewModel 构造函数中。 ViewModel 有一个属性MessageHandler,它上面有一个ReactiveCommand 属性,称为ReceiveMessage。 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);
我不反对保留我所拥有的,除非有人发现它存在缺陷。我正在寻找一些可能不那么冗长且更容易理解的东西。
【问题讨论】:
标签: c# reactiveui