0

次のようなコマンドに関連付けられた 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 キーが押されるたびに呼び出されます。残念ながら、CanExecutefalse が返された場合、ユーザーは、コマンドが実行されなかったことを (視覚的に) 確認できません。これは、TextBox に視覚的な変化がないためです。

Enter キーを押した後にコマンドを実行できなかったことをユーザーに示す方法についてのアドバイスを探しています。

私の考え(およびそれらについての私の疑問):

  • CanExecuteが返されたときに TextBox を無効にする: の戻り値は文字が入力/変更されるたびに変わる可能性がfalseあるため、これはオプションではありません(TextBox 内のテキストは の結果に影響します)。初めて無効にすると、ユーザーはそれ以上入力できないため、永久に無効のままになります。CanExecuteCanExecute

  • コマンドが実行されなかったことを示すメッセージ ボックスを表示します。ViewModel は View を認識しないことに注意してください。ViewModel からメッセージ ボックスを開くことはできますか? さらに、メッセージボックスを開くための呼び出しはどこに置くべきですか? CanExecuteEnterキーを押した後にのみメッセージボックスを取得したいので、内部ではありません。毎回CanExecutereturnではありませんfalse。たぶん、CanExecute常に returntrueを作成し、内部でチェックを行いますExecute: チェックが問題ない場合は、コマンドを実行し、そうでない場合は、ユーザーにメッセージを表示します。しかし、それでは、持つという点がCanExecute完全に失われています...

私はMVVMを維持したいのですが、ViewModelにリダイレクトするためのコードビハインドは私にとっては問題ないようです。

4

2 に答える 2

0

クラスでプロパティを使用bool IsCommandExecutedしますCommand。それに応じてこのプロパティを設定します。

a を使用して、そのプロパティを次のようにプロパティにToolTipバインドします。IsOpenIsCommandExecuted

<TextBox ...>
    <TextBox.ToolTip>
        <ToolTip IsOpen="{Binding MyCommand.IsCommandExecuted}">...</ToolTip>
    </TextBox.ToolTip>
</TextBox>

これは概念を説明し、それに応じて変更します。

于 2016-10-05T09:11:37.213 に答える