Хотя приведенный ниже код работает, я не уверен, что это лучшая практика. Мне интересно, если я передумал ситуацию.Использование 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);
Я не против держать то, что у меня есть, если кто-то не найдет изъян с ним. Я ищу что-то, что может быть немного менее многословным и легче следовать.