2014-10-28 2 views
0

Хотя приведенный ниже код работает, я не уверен, что это лучшая практика. Мне интересно, если я передумал ситуацию.Использование ReactiveUI InvokeCommand Extension с изменяющимися целями

Ситуация: приведенный ниже код находится в моем основном конструкторе 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); 

Я не против держать то, что у меня есть, если кто-то не найдет изъян с ним. Я ищу что-то, что может быть немного менее многословным и легче следовать.

ответ

1

Не спрашивайте меня, почему я не думаю, чтобы просто сделать это:

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

Я смотрел на нее с ног на голову. Я думаю, что это достигнет того, чего я хочу.

Снова и снова я продолжаю находить, что этот каркас уже нашел решения проблем, которые я нахожу - это всего лишь вопрос для его grokking.

Смежные вопросы