MVVM 中的 ICommand 實作:避免重複實例化
問題:
為了避免重複建立 ICommand 實例,我嘗試使用自訂委託來實作 ICommand 類別。此類別包含兩個委託:OnExecute
(void 委託,接受 object 參數)和 OnCanExecute
(bool 委託,接受 object 參數)。
程式碼如下:
<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-coalescing assignment (??=
) 確保只建立一次 RelayCommand
實例。
參考:
透過使用 RelayCommand
或類似的預先建置實現,可以避免自訂委託帶來的額外複雜性,並獲得更簡潔、更可靠的程式碼。
以上是在 ICommand 實作中使用自訂委託是避免重複實例化的最佳方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!