2009-05-22 11 views
0

Josh SmithによるMVVMパターンの適用が難しくなります。私はここでこの問題を研究しており、構文が正しいとは思われません。RelayCommandラムダ構文の問題

以下のコードは必要な構文に従っているようですが、Visual Studioはエラーを報告します。 "代理人 'System.Action'は '2'引数" "を表示しません。

誰かが私が間違っている場所を見ることができますか?ありがとう!
+トム

RelayCommand _relayCommand_MoveUp; 
    public ICommand RelayCommand_MoveUp 
    { 
     get 
     { 
     if (_relayCommand_MoveUp == null) 
     { 
      _relayCommand_MoveUp = new RelayCommand(
      (sender, e) => this.Execute_MoveUp(sender, e),  **ERROR REPORTED HERE** 
      (sender, e) => this.CanExecute_MoveUp(sender, e)); 
      return _relayCommand_MoveUp; 
     } 
     } 
    } 

    private void Execute_MoveUp(object sender, ExecutedRoutedEventArgs e) 
    { 
     if (_selectedFolder != null) 
     { 
     _selectedFolder.SelectParent(); 
     } 
    } 

    private void CanExecute_MoveUp(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = (_selectedFolder != null) && (_selectedFolder.Parent != null); 
     } 


//And from Josh Smith: 

    public class RelayCommand : ICommand 
    { 
    public RelayCommand(Action<object> execute); 
    public RelayCommand(Action<object> execute, Predicate<object> canExecute); 

    public event EventHandler CanExecuteChanged; 

    [DebuggerStepThrough] 
    public bool CanExecute(object parameter); 
    public void Execute(object parameter); 
    } 

答えて

2

RelayCommandは、私はあなたが混乱し終わるところだと思うRoutedCommandの、ではありません。

Relayコマンドのコンストラクタは、Action delegateとオプションのPredicate delegateをとります。これらの代理人はEventArgsを使用しません。ただ1つのObjectパラメータだけがエラーに遭遇しています。また、述部には戻り型のboolが必要です。これは次のエラーです。あなたがRoutedCommandのようにe.CanExecuteを設定するのではなく、CanExecute述語では単にtrue/falseを返します。ここで

は、それがどのように見えるべきかです:(コメント欄での議論から追加)

​​



EDIT:

あなたが作るであろう、よりRoutedCommandsのようなものを使用したい場合ViewModelsはWPF固有のビューに依存していますが、いくつかの良いオプションがあります。

このdiscussionは、開始されたMVVMと一緒にRoutedCommandsを使用するという完全なアイデアを得ました。

そしてhere'sジョシュ・スミスとビル・ケンプによって提示された問題に対する非常に固い解決策です。

+1

おかげで、rmoore:

は、デリゲートにパラメータを渡すには、彼の新しいRelayCommand < T代わり>コンストラクタを使用する必要があります。したがって、呼び出されたメソッド内でEventArgsにアクセスする必要がある場合、RelayCommandクラスを使用して呼び出すことができないことを正しく理解していますか? + tom –

+0

これは間違いなく、基本的なICommandはイベントを実装していません。実際、私の知る限りではRoutedCommandはありません。実際はRoutedCommandが探すCommandBindingというものから来ています。 MVVMのRoutedCommandsのいくつかの追加情報を私の投稿に追加しました。このコメントに余裕がないので=) – rmoore

+0

ありがとう! +10 ... –

3

この週末(8月22日)ジョシュ・スミスはMvvmFoundationプロジェクトのコード・チェインに新しい変更をチェックインし、RelayCommandがパラメータ付きのデリゲートで動作する方法を変更しました。注意してください!

public ICommand GotoRegionCommand 
    { 
     get 
     { 
      if (_gotoRegionCommand == null) 
       _gotoRegionCommand = new RelayCommand<String>(GotoRegionCommandWithParameter); 
      return _gotoRegionCommand; 
     } 
    } 
    private void GotoRegionCommandWithParameter(object param) 
    { 
     var str = param as string; 
    } 
+0

情報ありがとう、jasonD。私は新しいMS MVVM Toolkit 0.1 Visual Studioプロジェクトテンプレートに賛成してジョシュスミスのコードを放棄しました。これは私が非常に喜んでいます。それは使いやすく、非常に良い文書を持っています。 http://wpf.codeplex.com/Wiki/View.aspx?title=WPF%20Model-View-ViewModel%20Toolkitを参照してください。 –