在 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中文網其他相關文章!