ReactiveCommand.Create выдает исключение 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); } }
}

Ошибка:

Невозможно преобразовать лямбда-выражение в тип IObserver, потому что это не тип делегата

Я также пробовал следующее:

    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;

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

Исключение типа System.NotSupportedException произошло в ReactiveUI.dll, но не было обработано в пользовательском коде.

Дополнительная информация: Индексные выражения поддерживаются только с константами.

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


person Scott Nimrod    schedule 17.12.2015    source источник


Ответы (1)


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

WhenAnyValue принимает свойство, в то время как вы загружаете его методом, который вызывает исключение времени выполнения (см. исходный код).

Проверьте, работает ли это (я изменил 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);
person pmbanka    schedule 17.12.2015
comment
Я попробовал ваше предложение. Однако я получаю следующую ошибку: не удается преобразовать лямбда-выражение в тип «IObserver ‹object›», потому что это не тип делегата. - person Scott Nimrod; 17.12.2015
comment
Поддерживается ли это в UWP (например, Windows Phone 10)? - person Scott Nimrod; 17.12.2015
comment
Должен признать, что я озадачен, согласно веб-сайту, это должно работать и на UWP. Не могли бы вы отредактировать свой вопрос, указав новую версию кода и подробную информацию об ошибке? - person pmbanka; 17.12.2015
comment
Ах, понятно, теперь проблема в звонке по подписке. Попробуйте добавить "using System;" поверх вашего файла. Подробнее см. stackoverflow.com/q/10521000/1108916. - person pmbanka; 17.12.2015