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中文网其他相关文章!