1

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 ビューは特定のビューモデルのコマンド オブジェクトに直接バインドされ、それは実行され、ハンドラーを実行できます。

この場合、それは意味がありますか?

使用/興味がある場合に備えて、問題のコードのコピーを添付しました。

ありがとう、フィル

4

2 に答える 2

1

どちらが使いやすいかは、あなた次第です。

これらのコマンドを再利用できないという理由だけで、私は個人的にコマンドに .Text プロパティを設定しません。フレームワークで提供される RoutedUICommands (または同様のカスタム静的コマンド) とは異なります。これらはどこでも再利用され、そのコマンドで "Exit" の変換が変更されると、アプリケーション全体に反映されるためです。これはあなたの例には当てはまりません-すべてが一度限りです。

あなたの場合、ボタンテキストのこのテキストは実際にコマンドから分離されているため(一方が他方に影響を与えますが)、おそらくそれらを分離するためのコードが少し少なくなり、簡単になりますが、違いはありませんそれだけだと、何よりも好みの問題になってしまいます。

私は間違いなく2つのコマンドについてあなたと一緒です-blech。あなたが書くほとんどのボタン デリゲートは、何らかの方法で状態に反応する必要があります (あなたが話しているサービスがダウンしている、ユーザーがこれを選択した場合、このデータをこのように入力する必要がある、など)。デリゲートは、ViewModel のステートフルな情報に適応します。

とにかく、これは少し冗長です... 要点は、「快適に感じることは何でもする」ことです。

于 2009-08-24T19:58:26.960 に答える
0

最後のポスターが言ったように、「快適に感じるものは何でも」.

私の場合、通常はDelegateCommandのようなものを使用します。データにバインドする必要がある場合は、VM にバインドします。コマンドが実行されると、VM 内で (init で DelegateCommand に提供されたデリゲートを介して) 実行されます。次に、実行されたデリゲートは、コマンドを満たすために再利用可能なコードを実行する場合と実行しない場合があります。

コマンドを独自の VM として使用したいようです。自分でこれをやろうと思ったことは一度もありませんでしたが、気分がいいならやってください!:)

于 2009-08-25T18:54:31.060 に答える