3

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

ПРИМЕЧАНИЕ. Функция 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

Я думаю, что CommandParameter собирается как строка. – sexta13

+0

Вы правы, CommandParameter идет как строка. Как вы думаете, что это повлияет на canExecute, который жестко закодирован, чтобы вернуть true? – Rock

+0

странно ... вы можете попробовать ввести функцию? что-то вроде: RelayCommand x = new RelayCommand (req => {string s = "true";}, req => canExecute()); частный bool canExecute() { return true } – sexta13

ответ

2

Посмотрите на the code for 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, поэтому условие не получится потому что parameter не null, а предложение is неверно. Другими словами, если значение параметра не соответствует типу T команды, то оно возвращает false.

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

+0

Благодарим вас за освобождение! После более пристального взгляда я считаю, что это то, что sexta13 ускользает, но вербальный ответ, который вы предоставили, более правилен. – Rock