在 WPF 的 Model-View-ViewModel (MVVM) 架构中,频繁的 ICommand 实现很常见。 创建大量单独的 ICommand 类可能会导致重复的代码。本文提供了可重用 ICommand 实现的解决方案,以提高效率。
一种简单的方法涉及利用两个委托方法的单个 ICommand 类:一个用于 Execute
,一个用于 CanExecute
。 构造函数接受这些委托,并在 ICommand 方法中调用它们。
然而,从 Karl Shifflet 的最初概念中提炼出来的一个更好的替代方案是 RelayCommand
。
RelayCommand
类实现 ICommand
接口,分别使用 Action<T>
和 Predicate<T>
表示 Execute
和 CanExecute
。这为 ICommand 实现提供了一种更紧凑、适应性更强的方法。
<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; } // ICommand implementation // ... }</code>
将 RelayCommand
集成到 ViewModel 类中可以简化 ICommand 实例化。
<code class="language-csharp">public class MyViewModel { private ICommand _doSomething; public ICommand DoSomethingCommand { get { if (_doSomething == null) { _doSomething = new RelayCommand( p => this.CanDoSomething(), p => this.DoSomeImportantMethod()); } return _doSomething; } } }</code>
虽然带有委托的自定义 ICommand 实现很实用,但 RelayCommand
提供了更优雅、更灵活的解决方案。 采用 RelayCommand
显着简化了 MVVM 项目中的 ICommand 实施。
以上是如何在 WPF 的 MVVM 模式中创建可重用的 ICommand 实现?的详细内容。更多信息请关注PHP中文网其他相关文章!