儘管下面的代碼工作,我不知道這是最佳做法。我想知道我是否過度思考這種情況。使用ReactiveUI InvokeCommand擴展與改變目標
情況:下面的代碼在我的主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);
我不反對保留我所得到的,除非有人發現它的缺陷。我正在尋找一些可能稍微冗長一些並且更容易遵循的事情。