2

基本的にボタンが付いたテキスト ボックスであるカスタム コンポーネントがあります。ボタンは、テキスト ボックスに対してアクションを実行することになっています。たとえば、ボタンをクリックすると、テキスト ボックスにランダムな文字列が入力される可能性があります。

テキスト フィールドは、ViewModel のプロパティにバインドされます。基本的には次のようになります。

それぞれにボタンが付いた 3 つのカスタム コンポーネント

コンポーネントに一般的なコマンドを設定する最良の方法は何ですか?

RelayCommandこれまでに行ったことは、ViewModel にパラメーターを期待する1 つのジェネラルがあることです。各ボタンには、その単一のコマンドに設定されたコマンドがあり、CommandParameterプロパティを使用して、実際に話しているテキスト フィールド コンポーネントに関する情報を追加します。次に、ViewModel はその情報を使用して正しいプロパティを見つけ、その値を変更します (バインディングを介してテキスト ボックスを更新します)。

これは問題なく機能しますが、関連するテキスト ボックスまたはコンテキストに関する情報を手動で挿入する必要があるのは嫌いです。理想的には、どのテキスト ボックスまたはバインドされたプロパティについて話しているかを既に知っているコンテキスト スコープ内でコマンドを実行したいと考えています。これを行う方法はありますか?

私が遭遇したもう 1 つの問題は、ボタン アクションをキー コマンドにバインドしたいということです。そのため、テキスト ボックスにフォーカスしてキー ショートカットを押すと、正しいボタンをクリックしたかのように動作するようにします。つまり、コマンドを実行して正しいコンテキスト情報を渡します。私の代替案は、これをコード ビハインドに入れ、基本的に現在のフォーカスからコマンド パラメーターを抽出することですが、よりクリーンなソリューションを希望します。

これをMVVMで機能させる良い方法はありますか?

4

2 に答える 2

0

テキストボックスとボタンの組み合わせのカスタムコントロールがすでにあるので、UserControlを作成することは私にとって本当に必要なオプションではありませんでした。私のコントロールは、ボタンのコマンドとコマンドパラメーターのバインド可能なプロパティを公開します。今のところ、質問で説明した内容に固執しています。コマンドパラメータを使用してビューモデルの対応するプロパティを更新し、データバインディングを介して更新します。

後でどれだけ繰り返しになるかに応じて、それを複数のカスタムコントロールにカプセル化するか、Scroog1が示したのと同様のヘルパーを作成する場合があります。

実際に私の最大の関心事であったキーコマンドに関しては、これは最終的にはビューだけで処理する必要があるものであることに気づきました。したがって、私のビューモデルはキーコマンドを完全に認識していません。

ウィンドウのコードビハインドにバインドされている標準のコマンドがあり、現在フォーカスされている要素を検索し、それがカスタムコントロールのタイプであるかどうかを確認してから、基になるコマンドを実行するだけです。したがって、コードビハインドは基本的に、コマンドの実行をフォーカスされたコントロールに委任するだけです。

これは完全な解決策ではありませんが、コマンドの実際の「コンテキスト感度」が必要なため、これは今のところ正常に機能しており、ビューをロジックから正しく分離しています。

于 2012-09-27T12:26:45.367 に答える