2017-01-25 9 views
2

Я хочу передать параметр из моего представления в мой ViewModel, когда выполняется ReactiveCommand, связанный с элементом управления. Параметр должен быть типа IJcUserReactiveUI: как правильно передать параметр ReactiveCommand.CreateFromTask

Так я определяю команду:

public ReactiveCommand<IJcUser, Unit> UserTouchCommand; 

UserTouchCommand = ReactiveCommand.CreateFromTask(user => RootViewModel.DisplayUserProfile(user)); 

подпись DisplayUserProfile выглядит

Task DisplayUserProfile(IJcUser user);

Но компилятор жалуется, потому что user от типа CancelationToken и не как ожидалось IJcUser

Я, наконец, нашел решение, но не понимаю, почему первый подход не сработал.

UserTouchCommand = ReactiveCommand.CreateFromTask<IJcUser>(RootViewModel.DisplayUserProfile); 

ответ

3

я, наконец, я нашел решение, но не понимаю, почему первый подход не работает.

Потому что вы используете неправильную перегрузку метода ReactiveCommand.CreateFromTask. Делегатом user => RootViewModel.DisplayUserProfile(user) может быть Func<CancellationToken, Task> или Func<IJcUser, Task>. Компилятор не может знать, какой из них, если вы не скажете ему:

Func<IJcUser, Task> x = user => DisplayUserProfile(user); 
UserTouchCommand = ReactiveCommand.CreateFromTask(x); 

Или вы могли бы быть четко о аргумент типа:

UserTouchCommand = ReactiveCommand.CreateFromTask<IJcUser>(DisplayUserProfile); 
+0

не Если компилятор сможет получить это из декларации командования? – Thomas

+0

Нет. Как уже упоминалось, как предполагается, что ваш func является Func , а не Func или Func , если вы не скажете об этом? Это невозможно. – mm8

+0

Очень полезно передать параметр 'ReactiveCommond.CreateFromTask'. ReactiveUI делает это очень запутанным здесь (много перегруженных типов, типов вычетов и необязательных параметров) и всегда заставляет меня чувствовать себя отчаянным. – Felix

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