【发布时间】:2012-10-23 20:41:22
【问题描述】:
我在 silverlight 5 项目中使用 MVVM/Caliburn.Micro,我需要自动将用户在 silverlight 文本框中输入的文本更改为大写。
首先,我认为我可以将 ViewModel 上的支持变量设置为大写,并且双向绑定会更改文本。那没有用(尽管我相信如果我使用失去焦点事件会这样做,但我不能这样做,因为我还必须为 KeyUp 做其他事情,并且附加两个事件会导致 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);
}
}
【问题讨论】:
-
@Silvermind,-这是我首先尝试的(完全像 devdigital 的建议答案),但它并没有反映 UI 的变化
-
@McAden - 我看到了那个答案,但就像我说的那样,不幸的是,我还有一些其他代码必须在按键时执行,并且在 xaml 中添加两个事件不会编译,所以这似乎没有成为一种选择
-
您可以将两个 EventTrigger 附加到同一个事件上。以我的回答为例。
标签: c# silverlight xaml mvvm caliburn.micro