RelayCommandラムダ構文の問題
-
23-08-2019 - |
質問
私はジョシュ・スミスあたりMVVMパターンを適用し、困難を抱えています。私はここに問題を調査してきたと構文は非常に権利を取得できないようです。
の行に表示されていることが必要な構文を次のように以下のコードは、私には見えますが、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);
}
解決
RelayCommandは、あなたが終わるところ、私はあると思いRoutedCommandのではない混乱します。
リレーコマンドのコンストラクタは、アクションデリゲートを取り、オプションの述語デリゲートする。これらのデリゲートを使用すると、エラーが発生している理由である、ちょうど単一のオブジェクトパラメータを、EventArgsのを取ることはありません。述語はまた、あなたが買ってあげる、次のエラーであるブール値の戻り値の型を、必要とします。あなたがRoutedCommandのをどうのように代わりにe.CanExecuteを設定するCanExecute述語では、単にfalseを/ trueを返します。
ここではそれがどのように見えるべきかです。
public ICommand RelayCommand_MoveUp
{
get
{
if (_relayCommand_MoveUp == null)
{
_relayCommand_MoveUp = new RelayCommand(Execute_MoveUp, CanExecute_MoveUp);
}
return _relayCommand_MoveUp;
}
}
private void Execute_MoveUp(object sender)
{
if (_selectedFolder != null)
{
_selectedFolder.SelectParent();
}
}
private void CanExecute_MoveUp(object sender)
{
return (_selectedFolder != null) && (_selectedFolder.Parent != null);
}
(コメント欄での議論から追加)の EDIT:の
あなたはWPF固有のビュー上のviewmodelsがより依存させるであろう、よりRoutedCommandsのようなものを使用したい場合は、利用できるいくつかの良いオプションがあります。
この議論には、全体を得ましたMVVMと一緒にRoutedCommandsを使用してのアイデアを開始します。
とここでは、ジョシュ・スミスが提示する問題に非常に固溶体をしていますそしてビル・ケンプます。
他のヒント
この週末(8月22日)ジョシュ・スミスがRelayCommandがパラメータと代表団のために働く方法を変更し、彼MvvmFoundationプロジェクトのためのCodePlexに新しい変化でチェック。気をつけろ!
デリゲートにパラメータを渡すには、代わりに彼の新しい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;
}