2016-03-21 18 views
3

MVVM Light RelayCommandジェネリックタイプ固有の理由で、そのcanExecuteがバインディングで常にfalseに解決される原因が分かりますか?正しい振る舞いを得るために、私はオブジェクトを使い、それを望ましいタイプに変換しなければなりませんでした。MVVM Light canExecuteは常にRelayCommandでfalseを返します<bool> notReayCommand <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は文字列として使用されています。 trueを返すようにハードコーディングされたcanExecuteにどのような影響があると思いますか? – Rock

+0

strange ...あなたは関数を入れようとすることができますか? RelayCommand x = new RelayCommand (req => {string s = "true";} req => canExecute()); プライベートブールcanExecute() { return true } – sexta13

答えて

2

ルックは、特に私が付いたライン「!!!」:

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文字列、「真」ではないので、条件は失敗しますparameternullでなく、is句がfalseであるためです。つまり、パラメータの値がコマンドのタイプTと一致しない場合は、falseを返します。

ブール値をXAMLにハードコードする(つまり、サンプルがダミーコードではない)場合は、this questionを探してください。

+0

これをクリアしていただきありがとうございます!私は、それがsexta13が逃げ出していたものだと考えていますが、あなたが提供した冗長な答えはより正確です。 – Rock

関連する問題