ホームページ >バックエンド開発 >C++ >WPF の MVVM パターンで再利用可能な ICommand 実装を作成するにはどうすればよいですか?

WPF の MVVM パターンで再利用可能な ICommand 実装を作成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-20 17:36:17611ブラウズ

How Can I Create Reusable ICommand Implementations in WPF's MVVM Pattern?

WPF の MVVM パターンでの ICommand 実装の合理化

WPF の Model-View-ViewModel (MVVM) アーキテクチャでは、頻繁に ICommand が実装されるのが一般的です。 多数の個別の ICommand クラスを作成すると、コードの繰り返しが発生する可能性があります。この記事では、効率を高めるための再利用可能な ICommand 実装のソリューションを提供します。

単純なアプローチには、2 つのデリゲート メソッド (Execute 用と CanExecute 用) を利用する単一の ICommand クラスが含まれます。 コンストラクターはこれらのデリゲートを受け入れ、ICommand メソッド内で呼び出します。

しかし、Karl Shifflet の初期コンセプトから洗練された優れた代替案は RelayCommand です。

RelayCommand の活用

RelayCommand クラスは、ICommandAction<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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。