MVVM Light может всегда выполнять false с RelayCommand<bool> not RelayCommand<object>

Кто-нибудь знает, почему конкретность с универсальным типом MVVM Light RelayCommand привела бы к тому, что его canExecute всегда будет иметь значение false для привязки? Чтобы получить правильное поведение, мне пришлось использовать объект, а затем преобразовать его в нужный тип.

ПРИМЕЧАНИЕ: canExecute был упрощен до логического значения для тестирования блока, который не работает и обычно является свойством CanRequestEdit.

Не работает:

public ICommand RequestEditCommand {
  get {
    return new RelayCommand<bool>(commandParameter => { RaiseEventEditRequested(this, commandParameter); },
                                  commandParameter => { return true; });
  }
}

Работает:

public ICommand RequestEditCommand {
  get {
    return new RelayCommand<object>(commandParameter => { RaiseEventEditRequested(this, Convert.ToBoolean(commandParameter)); },
                                    commandParameter => { return CanRequestEdit; });
  }
}

XAML:

<MenuItem Header="_Edit..." Command="{Binding RequestEditCommand}" CommandParameter="true"/>

1 ответ

Решение

Посмотрите на код дляRelayCommand<T>конкретно строка, которую я пометил "!!!":

public bool CanExecute(object parameter)
{
    if (_canExecute == null)
    {
        return true;
    }

    if (_canExecute.IsStatic || _canExecute.IsAlive)
    {
        if (parameter == null
#if NETFX_CORE
            && typeof(T).GetTypeInfo().IsValueType)
#else
            && typeof(T).IsValueType)
#endif
        {
            return _canExecute.Execute(default(T));
        }

        // !!!
        if (parameter == null || parameter is T)
        {
            return (_canExecute.Execute((T)parameter));
        }
    }

    return false;
}

Параметр, который вы передаете своей команде, является строкой "true", а не логическим значением true, поэтому условие не будет выполнено, потому что parameter не является null и is пункт является ложным. Другими словами, если значение параметра не соответствует типу T команды, то она возвращает false,

Если вы действительно хотите жестко запрограммировать логическое значение в свой XAML (т. Е. Ваш пример не является фиктивным кодом), посмотрите этот вопрос, чтобы узнать, как это сделать.

Другие вопросы по тегам