我发现这个link关于类似的问题,除了我的文本框添加扭曲后需要一个格式化的值失去焦点后。WPF MVVM:TextBox需要的格式和按钮与IsDefault设置为True
<TextBox Text="{Binding Value}" MaxLength="{Binding MaskLength}"/>
<Button Command="{Binding ExecuteCommand}" IsDefault="True"/>
在用户在文本框中输入文本后,我想用用户定义的掩码格式化文本。例如,如果掩码是“00000”,则惯例将是右对齐和零填充。
123 => 0 A01 => 00A01
等等
,我快到的问题是,我应该只格式化文本一次,当用户有完成打字。目前,如果用户点击按钮,用户输入的值被推送到绑定并执行该命令。但是,如果他们按下“Enter”键,则该值不会被推送到绑定,并且命令仍然被执行。
我发现如何在用户按下回车键时推送绑定的唯一方法是更改文本框的绑定并指定UpdateSourceTrigger=PropertyChanged
。这不能很好地工作,因为我实际上并不知道用户何时完成输入文本。
最简单的解决方案是在按下回车键时添加代码隐藏功能以设置按钮的焦点,但是我希望将焦点留在当前所在的文本框中。有没有人有办法解决这个问题,也许是附属物?
编辑:
这里是我的视图模型是如何格式化输入值的一个简单的例子。
public string Value
{
get
{
return mFieldValue;
}
set
{
SetValueAndRaisePropertyChange(
ref mFieldValue,
_ApplyFormat(value),
() => FieldValue);
}
}
这是我找到的最简单的黑客代码。我把它转换成了一个附属的房产,但它的气味仍然不太好。
private void _HandleTxtKeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Enter)
{
TextBox textBox = (TextBox)sender;
BindingExpression binding = textBox.GetBindingExpression(TextBox.TextProperty);
if(binding != null)
{
binding.UpdateSource();
}
}
}
将其设置为PropetyChanged不更新源但格式是正确的。假设我想将值'ab1'格式化为'00AB1'。如果在用户点击“a”时设置为PropertyChanged,则该值将变为“0000A”。现在用户点击'b',并且由于达到了最大长度而被忽略。 – 2010-08-31 15:51:50
没有它没有。请参阅我的下一个答案,以查看完全有效的代码(已测试) – JanW 2010-08-31 16:19:14