2

MVVM-WPFシナリオのViewModelsにコマンドを実装するときに、多くのコードを繰り返していることに気づきました。以下に示すように、標準の実装は、タイプのパブリック読み取り専用フィールドICommand、プライベートDelegateCommandフィールド、および実行ロジックのメソッドで構成されます。sget -accessorDelegateCommandで初期化されます。ICommand

すべてのコマンドの繰り返しを考慮して、このアプローチをどのように凝縮できますか?

private DelegateCommand saveCommand;
private DelegateCommand commandClearInputFileList;
private DelegateCommand commandInputFilesDeleteSelected;

public ICommand SaveCommand {
    get {
        if (saveCommand == null) {
            saveCommand = new DelegateCommand(CommitDataBasePush);
        }
        return saveCommand;
    }
}

public ICommand CommandClearInputFileList {
    get {
        if (commandClearInputFileList == null) {
            commandClearInputFileList = new DelegateCommand(InputFilesClear);
        }
        return commandClearInputFileList;
    }
}

public ICommand CommandInputFilesDeleteSelected {
    get {
        if (commandInputFilesDeleteSelected == null) {
            commandInputFilesDeleteSelected = new DelegateCommand(InputFilesDeleteSelected);
        }
        return commandInputFilesDeleteSelected;
    }
}
4

3 に答える 3

4

個人的に、私はこのスタイルが好きになっています:

    private DelegateCommand saveCommand;
    public ICommand SaveCommand 
    {
        get 
        {
            return saveCommand ?? 
                (saveCommand = new DelegateCommand(CommitDataBasePush));
        }
    }

または、より少ないコード行を使用します。

    private DelegateCommand saveCommand;
    public ICommand SaveCommand 
        => saveCommand ?? (saveCommand = new DelegateCommand(CommitDataBasePush));
于 2013-01-30T22:40:52.120 に答える
4

null合体演算子に加えて、遅延読み込みを使用できます。

private Lazy<DelegateCommand> _cmd = new Lazy<DelegateCommand>(() => new DelegateCommand(InputFilesClear) );

public ICommand CommandClearInputFileList { get { return _cmd.Value; } }

個人的には、 Caliburn.Microフレームワークによって提供される規則を優先して、コマンドから離れました。上記のコマンドは、単純にpublicメソッドに置き換えられます。

于 2013-01-30T22:44:13.043 に答える
2

DelegateCommandとその遅延初期化を、を実装する単純なカスタムコマンドクラスにラップできますICommand。私はそれを呼んでLazyCommandおり、その使用法はこれと同じくらい簡単です:

// Declaration
public ICommand SomeCommand { get; private set; }

// Definition
SomeCommand = new LazyCommand(ExecuteSomeCommandMethod);

クラスLazyCommandは次のようになります。

public class LazyCommand : ICommand
{
    private readonly Lazy<DelegateCommand> _innerCommand;

    public LazyCommand(Action executeAction, Func<bool> canExecuteAction = null)
    {
        _innerCommand = canExecuteAction == null ? 
            new Lazy<DelegateCommand>(() => new DelegateCommand(executeAction)): 
            new Lazy<DelegateCommand>(() => new DelegateCommand(executeAction, canExecuteAction));
    }

    public bool CanExecute(object parameter)
    {
        return _innerCommand.Value.CanExecute();
    }

    public void Execute(object parameter)
    {
        _innerCommand.Value.Execute();
    }

    public event EventHandler CanExecuteChanged
    {
        add { _innerCommand.Value.CanExecuteChanged += value; }
        remove { _innerCommand.Value.CanExecuteChanged -= value; }
    }

    public void RaiseCanExecuteChanged()
    {
        _innerCommand.Value.RaiseCanExecuteChanged();
    }
}

それがあなたのために働くかどうか私に知らせてください。乾杯...

于 2013-01-31T09:38:16.290 に答える