2015-12-17 2 views
0

Следующая строка вызывает исключение во время выполнения:ReactiveCommand.Create throws «NotSupportedException»: «Индексные выражения поддерживаются только константами».

Accept = ReactiveCommand.Create(this.WhenAnyValue(x => x.Canexecute())); 

Вот код:

public class InstructionsViewModel : ReactiveObject 
{ 
    public InstructionsViewModel() 
    { 
     Accept = ReactiveCommand.Create(this.WhenAnyValue(x => x.CanExecute)); 
     Accept.Subscribe(x => 
      { 
      Debug.Write("Hello World"); 
      }); 
    } 

     public ReactiveCommand<object> Accept { get; } 

    bool _canExecute; 
    public bool CanExecute { get { return _canExecute; } set { this.RaiseAndSetIfChanged(ref _canExecute, value); } } 
} 

Ошибка:

Cannot convert lambda expression to type 'IObserver' because it is not a delegate type

Я также попытался следующие:

public InstructionsViewModel() 
    { 
     Accept = ReactiveCommand.Create(this.WhenAnyValue(x => x.Canexecute())); 
     Accept.Subscribe(x => 
     { 
      Debug.Write("Hello World"); 
     }); 
    } 

    public ReactiveCommand<object> Accept { get; } 


    public bool Canexecute() => true; 

Я получаю следующее сообщение об ошибке:

An exception of type 'System.NotSupportedException' occurred in ReactiveUI.dll but was not handled in user code

Additional information: Index expressions are only supported with constants.

ли это даже поддерживается на Windows Phone 10?

ответ

1

Я думаю, что ваша проблема не с ReactiveCommand, но с WhenAnyValue.

WhenAnyValue принимает свойство, в то время как вы его подаете с помощью метода, который вызывает исключение времени выполнения (see the sourcecode).

Проверьте, работает ли это (я изменил CanExecute быть собственностью, а не метод):

public InstructionsViewModel() 
{ 
    Accept = ReactiveCommand.Create(this.WhenAnyValue(x => x.CanExecute)); 
    Accept.Subscribe(x => 
    { 
     Debug.Write("Hello World"); 
    }); 
} 

public ReactiveCommand<object> Accept { get; } 

private bool _canExecute; 
public bool CanExecute { get { return _canExecute; } set { this.RaiseAndSetIfChanged(ref _canExecute, value); } } 

Кроме того, в качестве общих рекомендаций - не гнездятся ваших вызовов, это делает отладку сложнее. Вы должны разделить создание команды на две строки:

var canExecute = this.WhenAnyValue(x => x.CanExecute) 
Accept = ReactiveCommand.Create(canExecute); 
+0

Я попробовал ваше предложение. Однако я получаю следующую ошибку: Невозможно преобразовать лямбда-выражение для ввода «IObserver », потому что это не тип делегата. –

+0

Поддерживается ли это в UWP (например, Windows Phone 10)? –

+0

Должен признать, что я озадачен, это должно работать и на UWP в соответствии с веб-сайтом. Не могли бы вы отредактировать свой вопрос с новой версией вашего кода и сведения об ошибке? – pmbanka

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