次のようなコマンドに関連付けられた TextBox があります。
<TextBox Text="{Binding Path=TextContent, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Command="{Binding Path=MyCommand}" Key="Enter" />
</TextBox.InputBindings>
</TextBox>
プロパティTextContent
は、ViewModel で定義された文字列です。このコマンドMyCommand
は ViewModel でも定義されています。ViewModel は View を認識していません。
このコマンドは、TextBox にフォーカスがあり、Enter キーが押されるたびに呼び出されます。残念ながら、CanExecute
false が返された場合、ユーザーは、コマンドが実行されなかったことを (視覚的に) 確認できません。これは、TextBox に視覚的な変化がないためです。
Enter キーを押した後にコマンドを実行できなかったことをユーザーに示す方法についてのアドバイスを探しています。
私の考え(およびそれらについての私の疑問):
CanExecute
が返されたときに TextBox を無効にする: の戻り値は文字が入力/変更されるたびに変わる可能性がfalse
あるため、これはオプションではありません(TextBox 内のテキストは の結果に影響します)。初めて無効にすると、ユーザーはそれ以上入力できないため、永久に無効のままになります。CanExecute
CanExecute
コマンドが実行されなかったことを示すメッセージ ボックスを表示します。ViewModel は View を認識しないことに注意してください。ViewModel からメッセージ ボックスを開くことはできますか? さらに、メッセージボックスを開くための呼び出しはどこに置くべきですか?
CanExecute
Enterキーを押した後にのみメッセージボックスを取得したいので、内部ではありません。毎回CanExecute
returnではありませんfalse
。たぶん、CanExecute
常に returntrue
を作成し、内部でチェックを行いますExecute
: チェックが問題ない場合は、コマンドを実行し、そうでない場合は、ユーザーにメッセージを表示します。しかし、それでは、持つという点がCanExecute
完全に失われています...
私はMVVMを維持したいのですが、ViewModelにリダイレクトするためのコードビハインドは私にとっては問題ないようです。