MVVM での ICommand 実装: インスタンス化の繰り返しを避ける
質問:
ICommand インスタンスを繰り返し作成することを避けるために、カスタム デリゲートを使用して ICommand クラスを実装しようとしました。このクラスには、OnExecute
(void デリゲート、オブジェクト パラメーターを受け入れる) と OnCanExecute
(bool デリゲート、オブジェクト パラメーターを受け入れる) の 2 つのデリゲートが含まれています。
コードは次のとおりです:
<code class="language-csharp">public class TestCommand : ICommand { public delegate void ICommandOnExecute(object parameter); public delegate bool ICommandOnCanExecute(object parameter); private ICommandOnExecute _execute; private ICommandOnCanExecute _canExecute; public TestCommand(ICommandOnExecute onExecuteMethod, ICommandOnCanExecute onCanExecuteMethod) { _execute = onExecuteMethod; _canExecute = onCanExecuteMethod; } //... }</code>
このアプローチは機能しますが、その実装の妥当性と、より良い方法があるかどうかについては疑問があります。
解決策:
このアプローチは、一般的に使用される RelayCommand
パターンに非常に似ていますが、RelayCommand
はより成熟した最適化されたソリューションです。
RelayCommand 実装:
<code class="language-csharp">public class RelayCommand : ICommand { private readonly Predicate<object> _canExecute; private readonly Action<object> _execute; public RelayCommand(Predicate<object> canExecute, Action<object> execute) { _canExecute = canExecute; _execute = execute; } //... }</code>
使用法:
<code class="language-csharp">public class MyViewModel { private RelayCommand _doSomething; public ICommand DoSomethingCommand { get { return _doSomething ??= new RelayCommand( p => this.CanDoSomething(), p => this.DoSomeImportantMethod()); } } }</code>
null 合体割り当て (??=
) を使用して、RelayCommand
インスタンスが 1 回だけ作成されるようにします。
参照:
RelayCommand
または同様の事前構築済み実装を使用すると、カスタム デリゲートのさらなる複雑さを回避し、よりクリーンで信頼性の高いコードを取得できます。
以上がICommand 実装でカスタム デリゲートを使用することは、インスタンス化の繰り返しを避けるための最良の方法ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。