2014-10-28 61 views
0

儘管下面的代碼工作,我不知道這是最佳做法。我想知道我是否過度思考這種情況。使用ReactiveUI InvokeCommand擴展與改變目標

情況:下面的代碼在我的主ViewModel構造函數中。 ViewModel有一個屬性MessageHandler,其上有一個ReactiveCommand屬性,名爲ReceiveMessage。 ViewModel有另一個屬性ScannerViewModelRawMessage屬性。我想使用ReactiveUI .InvokeCommand()擴展方法管道RawMessageReceiveMessage。我想要這個,是因爲它爲我檢查.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); 

我不反對保留我所得到的,除非有人發現它的缺陷。我正在尋找一些可能稍微冗長一些並且更容易遵循的事情。

回答

1

不要問我,爲什麼我沒有想到只是這樣做:

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

我看着它倒過來。我認爲這將實現我想要的。

一次又一次,我不斷尋找這個框架已經發現我找到問題的解決方案 - 它只是一個所著的Grokking它自己的問題。