3

JoshSmithのWPFアプリとModel-View-ViewModelデザインパターンのチュートリアル を読んでいます

以下のコードが何をしようとしているのかわかりません。
まず、構文はプロパティを思い出させますが、代わりにadd/removeを使用します。

しかし、何CommandManager.RequerySuggestedですか?

これは、イベントサブスクリプションをCommandManager.RequerySuggestedイベントに委任します。これにより、WPFコマンドインフラストラクチャは、組み込みコマンドを要求するたびに実行できるかどうかをすべてのRelayCommandオブジェクトに要求します。

//Figure 3 The RelayCommand Class
public class RelayCommand : ICommand 
{ 
#region Fields 
    readonly Action<object> _execute; 
    readonly Predicate<object> _canExecute; 
#endregion // Fields
#region Constructors 
public RelayCommand(Action<object> execute) : this(execute, null) 
{ } 
public RelayCommand(Action<object> execute, Predicate<object> canExecute) 
{ 
    if (execute == null) throw new ArgumentNullException("execute"); 
   _execute = execute; 
   _canExecute = canExecute; 
} 
#endregion // Constructors 
#region ICommand Members 
[DebuggerStepThrough] 
public bool CanExecute(object parameter) 
{ 
    return _canExecute == null ? true : _canExecute(parameter); 
} 
public event EventHandler CanExecuteChanged 
{ 
    add    { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 
public void Execute(object parameter) 
{ _execute(parameter); } 
#endregion // ICommand Members }

また、saveコマンドはラムダで構成されています。1つ目は、2つのパラメーター変数があります。彼らは対立しますか?私はただのようなことをすることはできません、RelayCommand(this.Save(), this.CanSave)またはそのような構文はありません。

_saveCommand = new RelayCommand(param => this.Save(),
                                param => this.CanSave );
4

1 に答える 1

3
  1. CommandManager.RequerySuggested += valueの関数CanExecuteが両方trueに解決できる場合、およびfalseいくつかの条件に応じてを意味します。

    Button/MenuItemWPFは、に評価された場合は(CommandButtonBase)を無効にしfalse、条件がに評価された場合は常に有効にしtrueます。
    これらの2行がない場合、WPFはコマンドを1回だけ要求します(Button / MenuItemがロードされたとき、手動で実行しない限り、その後は更新されません。

  2. 2つのパラメーター(ラムダ式)は、それぞれタイプAction<object>とaPredicate<object>です。したがって、定義上、競合することはできません(params単なる名前であり、2つの関数のスコープが異なるため、競合しません)。

    適切な署名を持つメソッドがある場合は、コンストラクターでそれを使用できます

    • private void Save(object obj)

      private bool CanSave(object obj)

    それぞれですが()、最後にを付ける必要はありません。したがって、newRelayCommand(this.Save,this.CanSave)が機能するはずです。

于 2010-08-22T15:51:39.387 に答える