MVVM의 ICommand 구현: 반복 인스턴스화 방지
질문:
ICommand 인스턴스를 반복적으로 생성하지 않기 위해 사용자 지정 대리자를 사용하여 ICommand 클래스를 구현하려고 했습니다. 이 클래스에는 OnExecute
(대리자 무효, 개체 매개 변수 허용) 및 OnCanExecute
(부울 대리자, 개체 매개 변수 허용)이라는 두 개의 대리자가 포함되어 있습니다.
코드는 다음과 같습니다.
<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
인스턴스가 한 번만 생성되도록 합니다.
참고:
RelayCommand
또는 이와 유사한 사전 구축 구현을 사용하면 사용자 정의 대리자의 추가 복잡성을 피하고 더욱 깔끔하고 안정적인 코드를 얻을 수 있습니다.
위 내용은 ICommand 구현에서 사용자 지정 대리자를 사용하는 것이 반복되는 인스턴스화를 방지하는 최선의 방법입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!