MVVM の専門知識を持つ誰かが、次のことが良い考えかどうかについて意見を提供できることを期待して、ここに投稿したいと思いました。
私は、Marlon Grech の SimpleCommand クラスを含む Sacha Barber の Cinch MVVM フレームワークを使用しています。
このクラスにはなく、他のいくつかの代替クラスにはありますが、Text プロパティは、UI 要素をコマンド操作の「タイトル」にバインドするために一般的に使用できます。したがって、Text プロパティを公開するこのクラスの拡張機能を作成しました。
今、私が遭遇したのは、コマンドを使用してデバイスへの接続を切り替えるユース ケースです。これを実装するには、さまざまな方法があります (常にあるとは限りません。ソフトウェアです!)。1 つの方法は、ViewModel から複数のコマンド オブジェクトを公開することです。1 つは「切断」用、もう 1 つは「接続用」です。ビュー モデルに接続状態 (IsConnected) を示すプロパティを公開させ、ビューを Connect コマンドまたは Disconnect コマンドのいずれかに条件付きでバインドさせます。ただし、このオプションに対する私の反応は...うんざりです!
代わりに私が最初に見始めたのは、Text プロパティを提供するだけでなく、コマンド オブジェクトに INotifyPropertyChanged を実装させて、ビューモデルによってテキスト プロパティをシステム状態に応じて「接続」または「切断」に動的に変更できるようにすることでした。これにより、複数のコマンドを使用することを避け、1 つの「ToggleConnection」コマンド オブジェクトを公開するだけで済みます。
ただし、この道を歩み始めると、コマンドの状態に応じて UI を変更する必要がある、このパターンの他のバリエーションが存在する可能性があることに気付きました。たとえば、接続状態に応じてコマンドのテキストを変更するだけでなく、接続状態に応じてアイコンを変更する必要がある場所がある場合があります。そこで、INotifyPropertyChanged を実装し、'Text' と 'State' の 2 つのプロパティを公開する 'Stateful' クラスの作成を開始しました。State の型をユーザーが定義できるように、クラスをジェネリックにしました (私は通常、回避可能な場合は「オブジェクト」を使用しないことを好みます)。
私が持っている質問は... これは良い考えだと思いますか、それとも悪い考えだと思いますか? コマンドの本来の意図/設計から逸脱している可能性があります。私が見てきたことから、コマンド オブジェクトはシステムの「動詞」であるため、ステートレスであることを意図していたのが一般的である可能性があります。ルーティングされたコマンドでは、私が物事を正しく理解していれば、通常、コマンドのターゲットのみが状態を持つことが期待されます。特に、コマンドバインディングが宣言されている場所に応じて、同じコマンドが異なるハンドラーにルーティングされる可能性があるためです。
したがって、少なくともルーティングされたコマンドでは、状態は意味をなさないと考えています。
ただし、ルーティングされたコマンドは扱っていません。具体的には MVVM コマンドを扱っています。この場合、基本的にコマンドの条件付きルーティングはありません。MVVM ビューは特定のビューモデルのコマンド オブジェクトに直接バインドされ、それは実行され、ハンドラーを実行できます。
この場合、それは意味がありますか?
使用/興味がある場合に備えて、問題のコードのコピーを添付しました。
ありがとう、フィル