0

インターフェイスを実装するICommandと、次のメソッドが作成されます

#region ICommand Members

    public bool CanExecute(object parameter)
    {
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
    }

#endregion

興味深い部分は

public void Execute(object parameter)
{
}

1つのパラメーターが必要であることを示しているからです。パラメータを渡す必要がない場合はどうなりますか?私のViewModelには次のコードがあります

public class DownloadViewModel : BaseViewModel
{
    public ICommand BrowseForFile { get; set; }

    public string File { get; set; }

    public DownloadViewModel()
    {
        BrowseForFile = new RelayCommand(new Action<object>(OpenDialog));
    }

    private void OpenDialog(object o)
    {
        var dialog = new System.Windows.Forms.FolderBrowserDialog();
        System.Windows.Forms.DialogResult result = dialog.ShowDialog();
        File = dialog.SelectedPath;
    }
}

このOpenDialogメソッドはパラメーターを必要としませんが、インターフェイスを満たすために必要なように見えます。

私はこれを正しく行っていますか、それとも要点を見逃しましたか?

4

2 に答える 2

2

はい、ICommand常にオブジェクトRelayCommandも必要です。それが必要ない場合は、nullを渡し、メソッドで使用しないでください。これは醜いです。

DelegateCommand代わりにPrismを使用します。これは、パラメータをとらない非汎用バージョンに存在します。

Command = new DelegateCommand(DoSomething);
CommandWithParameter = new DelegateCommand<int>(DoSOmethingWithInt);

これはPRISMアセンブリにあり、ダウンロードして参照する必要があります。

using Microsoft.Practices.Prism;

プリズム

または、基本的に同じことを行うコマンドクラスを提供するMVVMLightツールキットを使用します。とにかくMVVMフレームワークなしでMVVMを使用する意味はありません。DelegateCommandPRISMをお勧めします。これは、またはのような基本的なものでもありEventAggregatorます。

于 2013-03-08T09:31:09.410 に答える
2

Executeパラメータを取るという事実は、あなたのViewModel. パラメータの必要性に影響を与える唯一のものOpenDialogは、 の実装ですICommand

たとえば、実装が次の場合:

public class MyRandomCommand : ICommand
{
    private readonly Action _action;

    public MyRandomCommand(Action action)
    {
        _action = action;
    }

    public void Execute(object parameter)
    {
        _action();
    }

    ...
}

OpenDialog次のようにコマンドを作成できるため、メソッドにパラメーターは必要ありません。

public ICommand Command { get { return new MyRandomCommand(OpenDialog); } }

ただし、コマンドに渡すメソッドに対して任意の署名を要求できます。

の最も一般的な既製の実装はRelayCommand、0 または 1 のパラメーターを持つメソッドを受け取ることができ、Execute適切に呼び出されます。

于 2013-03-08T09:28:41.433 に答える