我在 silverlight 5 项目中使用 MVVM/Caliburn.Micro,我需要自动将用户在 silverlight 文本框中输入的文本更改为大写。
首先,我认为我可以将 ViewModel 上的支持变量设置为大写,并且双向绑定会更改文本。那没有用(尽管我相信如果我使用失去焦点事件会这样做,但我不能这样做,因为我还必须为 KeyUp 做其他事情,并且附加两个事件会导致 xaml 错误)
由于那不起作用,我尝试在 KeyUp 事件上调用方法。这在技术上是可行的,但是由于它正在替换文本,因此会将光标放回开头,因此用户最终会向后键入。
这似乎是相当简单的功能——如何将用户输入的文本转换为大写?我错过了一些简单的事情吗?
这是我现有的代码。xml:
<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 提出了一个很好的通用解决方案。我也几乎同时意识到有一个替代解决方案(只需将文本框作为参数传递给大写方法并移动光标),所以这里也是代码:
xml:
<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);
}
}