2016-12-22 7 views
6

Я использую библиотеку MVVM Light. Из этой библиотеки я использую RelayCommand<T> для определения команд с аргументом типа T.Как передать значение Nullable <Boolean> значение CommandParameter?

Теперь я определил RelayCommand, который требует аргумент типа Nullable<bool>:

private RelayCommand<bool?> _cmdSomeCommand; 
    public RelayCommand<bool?> CmdSomeCommand 
    { 
     get 
     { 
      if (_cmdSomeCommand == null) 
      { _cmdSomeCommand = new RelayCommand<bool?>(new Action<bool?>((val) => { /* do work */ })); } 
      return _cmdSomeCommand; 
     } 
    } 

Как я могу назначить CommandParameter из моего XAML кода?

Я попытался передать логическое значение, но это вызывает следующее исключение:

System.InvalidCastException: Invalid бросок от 'System.Boolean' до «System.Nullable`1 [ [System.Boolean, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] '.

Я также пытался определить статические свойства, содержащие bool? значения и ссылки на них из XAML:

public static class BooleanHelper 
{ 
    public static bool True { get { return true; } } 
    public static bool False { get { return false; } } 

    public static bool? NullableTrue { get { return true; } } 
    public static bool? NullableFalse { get { return false; } } 
} 

XAML:

<Button Command="{Binding CmdSomeCommand}" CommandParameter="{x:Static my:BooleanHelper.NullableTrue}" /> 

Но это приводит к тому же исключение быть выброшено. Я также попытался вернуть new Nullable<bool>(true), но, как и ожидалось, это имеет тот же результат.

+0

Вы видели это? http://stackoverflow.com/questions/2850629/declare-a-nullable-int-int-using-xaml – tolanj

ответ

2

Похоже, что MVVM Light неисправен для обработки параметра по-разному между Execute и CanExecute и не обрабатывает нулевое значение соответствующим образом.

Смотрите код на https://github.com/paulcbetts/mvvmlight/blob/master/GalaSoft.MvvmLight/GalaSoft.MvvmLight%20(NET35)/Command/RelayCommandGeneric.cs#L198 линиях 198-205

Что там происходит, приводит к вашему исключению и может быть легко воспроизведена с помощью следующего кода:

object t1 = (bool?)true; 
// issue: for Nullable<T>, GetType will return T 
if (t1.GetType() != typeof(bool?)) 
{ 
    if (t1 is IConvertible) 
    { 
     var val = Convert.ChangeType(t1, typeof(bool?), null); 
    } 
} 

Я подозреваю, вы можете только отчет об ошибке , потому что вы можете отлично передать значение nullable как параметр, обрабатывается с ошибками.

+0

Спасибо! Это действительно вызывает проблему. Я подал сообщение об ошибке: [link] (https://mvvmlight.codeplex.com/workitem/7742). – Chris

+0

Тот же вопрос здесь 4 месяца спустя. Похоже, что это не будет исправлено :( – Speuline

+0

@Speuline Я не совсем уверен, относится ли код, на который я ссылался в вопросе, текущую реализацию MVVM Light, но если вы получите доступ к текущему источнику и проблема в нем, вы можете просто исправить проблему самостоятельно и быть счастливой с ней. – grek40