2016-12-22 3 views
6

私はMVVM Lightライブラリを使用しています。このライブラリからはRelayCommand<T>を使用して、引数がTのコマンドを定義します。Nullable <Boolean>の値をCommandParameterに渡すにはどうすればよいですか?

は今、私はタイプNullable<bool>の引数を必要とRelayCommandを定義している:

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

私は私のXAMLコードからCommandParameterを割り当てることができますどのように?

私はブール値を渡すために試してみたが、それは次の例外が発生

System.InvalidCastExceptionの: 'を可能System.Boolean' から無効なキャストをSystem.Nullable`1 [」に[System.Boolean、mscorlib、Version = 4.0.0.0、Culture =ニュートラル、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は、ExecuteCanExecuteの間でパラメータを異なる方法で処理し、適切な方法でnullableを処理できないように見えます。

そこにあなたの例外につながり、簡単に次のコードで再現することができます何が起こる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

ありがとう!それは確かに問題を引き起こします。私はバグレポート[https://mvvmlight.codeplex.com/workitem/7742]を提出しました。 – Chris

+0

4か月後に同じ問題が発生しました。それは訂正されないようです:( – Speuline

+0

@Speuline質問で参照しているコードが現在のMVVM Light実装を反映しているかどうかはわかりませんが、現在のソースと問題がある場合は、問題を自分で修正し、それに満足してもよいでしょう。 – grek40

関連する問題