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 (т. Е. Ваш пример не является фиктивным кодом), посмотрите этот вопрос, чтобы узнать, как это сделать.