Silverlight5プロジェクトでMVVM/Caliburn.Microを使用していますが、ユーザーがSilverlightテキストボックスに入力するテキストを大文字に自動的に変更する必要があります。
まず、ViewModelのバッキング変数を大文字に設定するだけで、双方向のバインドでテキストが変更されると思いました。それは機能しませんでした(フォーカスが失われたイベントを使用すると機能すると思いますが、KeyUpに対しても他にやらなければならないことがあるため、それを行うことはできません。2つのイベントをアタッチするとxamlエラーが発生します)
それがうまくいかなかったので、KeyUpイベントでメソッドを呼び出してみました。これは技術的には機能しますが、テキストを置き換えるため、カーソルが最初に戻るため、ユーザーは逆方向に入力することになります。
これはかなり単純な機能のようです-ユーザーが入力したテキストを大文字に変換するにはどうすればよいですか?簡単なものが足りませんか?
これが私の既存のコードです。Xaml:
<TextBox x:Name="SomeName" cal:Message.Attach="[Event KeyUp] = [Action ConvertToUppercase($eventArgs)]" />
モデルの表示:
public void ConvertToUppercase(System.Windows.Input.KeyEventArgs e)
{
SomeName = _someName.ToUpper();
//Other code that doesn't concern uppercase
}
代替ソリューションの編集:
McAdenは優れた一般的なソリューションを発表しました。また、ほぼ同時に、別の解決策があることに気付きました(テキストボックスをパラメーターとして大文字のメソッドに渡し、カーソルを移動するだけです)。そのためのコードも次のとおりです。
xaml:
<TextBox x:Name="SomeName" cal:Message.Attach="[Event KeyUp] = [Action ConvertToUppercase($source, $eventArgs)]; [Event KeyDown] = [Action DoOtherStuffThatIsntQuestionSpecific($eventArgs)]" />
csメソッド:
public void ConvertToUppercase(TextBox textBox, System.Windows.Input.KeyEventArgs e)
{
//set our public property here again so the textbox sees the Caliburn.Micro INPC notification fired in the public setter
SomeName = _someName.ToUpper();
//move the cursor to the last so the user can keep typing
textBox.Select(SomeName.Length, 0);
}
そしてもちろん、cs標準のCaliburn.Microプロパティ:
private String _someName = "";
public String SomeName
{
get
{
return _someName;
}
set
{
_someName = value;
NotifyOfPropertyChange(() => SomeName);
}
}