1

Silverlight と WPF のエンタープライズ アーキテクチャ向けの MVVM サバイバル ガイドに取り組んでいますが、コマンド セクションで問題が発生しました。具体的には、Action<object> と Func<object, bool> に基づいてコマンドを作成します。「アプリケーションをビルドして実行する」はずの時点で、代わりにコンパイル エラーが発生します。

コマンドのもの:

public class Command : ICommand
{
  private readonly Action<object> _execute;
  private readonly Func<object, bool> _canExecute;
  public Command(Action<object> execute, Func<object, bool> canExecute)
  {
    _execute = execute;
    _canExecute = canExecute;
  }
 public void Execute(object parameter)
  {
    _execute(parameter);
  }
  public bool CanExecute(object parameter)
  {
    return (_canExecute == null) || _canExecute(parameter);
  }
  ...
}

メソッド呼び出しのもの:

private Command _showDetailsCommand;
public Command ShowDetailsCommand
{
  get 
  { 
      return _showDetailsCommand 
             ?? (_showDetailsCommand 
                = new Command(ShowCustomerDetails, IsCustomerSelected));
   }
}
public void ShowCustomerDetails()
{
  if (!IsCustomerSelected()){
    throw new InvalidOperationException("Unable to display customer details. "
                + "No customer selected.");
  }
  CustomerDetailsTabViewModel customerDetailsViewModel = 
            GetCustomerDetailsTab(SelectedCustomerID);
  if (customerDetailsViewModel == null)
  {
    customerDetailsViewModel 
         = new CustomerDetailsTabViewModel
               (_dataProvider, 
                SelectedCustomerID);
    Tabs.Add(customerDetailsViewModel);
  }
  SetCurrentTab(customerDetailsViewModel);
}
private bool IsCustomerSelected()
{
  return !string.IsNullOrEmpty(SelectedCustomerID);
}

new Command(ShowCustomerDetails, IsCustomerSelected))「最適なオーバーロードされた一致にNorthwind.Application.Command.Command(System.Action<object>, System.Func<object, bool>)は無効な引数があります」というビットの下に波状の青い線が表示されます。

コンパイルしようとすると、上記のエラーに加えて、次の 2 つのメッセージが表示されます。

Argument 1: Cannot convert from method group to System.Action<object>
Argument 2: Cannot convert from method group to System.Func<object, bool>

今では、昨日よりもアクションと関数について多くのことを知っており、コマンド宣言を次のように変更することで、エラーをほとんど回避できます。

private readonly Action _execute;
private readonly Func<bool> _canExecute;

ICommandコード全体で同様のことを行っていますが、適切に実装していないというエラーが表示されます。

私の額/最も近い壁を保存するために、誰かが私が正しく行っていないことを教えて修正できるようにするか、指定された(本の)コードが私をうまくいっていないので先に進むことができます.

4

3 に答える 3

2

そりゃそうだから

private bool IsCustomerSelected()
{
    return !string.IsNullOrEmpty(SelectedCustomerID);
}

のタイプではなく、Func<object, bool>Func<bool>です。次のように見えるはずです

private bool IsCustomerSelected(object param)
{
    return !string.IsNullOrEmpty(SelectedCustomerID);
}

代わりに を使用できますPredicate<object>。これは、少なくとも私にとっては、署名がどのように見えるかがより明確になります。

于 2013-04-24T08:26:04.617 に答える
0

Action、Func は、C# がクロージャを実装するための設計方法です。アクションは、パラメーター オブジェクトを使用してクロージャーがあり、System.Void型を返すことを意味します。Func は、パラメーター オブジェクトを使用してクロージャーを実装し、System.Bool型を返す方法です。

C# でのクロージャの詳細については、Jon Skeet によるクロージャの美しさを参照してください。

于 2013-04-24T08:28:23.013 に答える