StringFormat,ConverterCulture和文本框的小数点

时间:2015-06-04 16:14:28

标签: c# wpf xaml textbox string-formatting

我想解决我一直以来的一个小怪癖。这不是一个真正的怪癖,而是一种我想要改变的行为。

如果我使用{N:2} StringFormat / ConverterCulture,则强制TextBox带有小数点始终(即使在输入文本的过程中)。我的意思是,你根本不能删除点或逗号,你必须能够弄清楚你必须移动到数字的下一个“字段”,以便通过点击鼠标来编辑小数点或按“右”。

由于这对大多数用户来说是无效的,有没有办法避免它而不需要重写格式化程序?我希望在现有属性的框架中有一些简单的东西。

示例,绑定到DataGrid单元格的XAML TextBox

<TextBox Name="TextBox1" Height="18" Margin="0,0,10,0" Text="{Binding SelectedItem[1], ConverterCulture=en-US, ElementName=Grid1, StringFormat={}{0:N2},   UpdateSourceTrigger=PropertyChanged}" Width="59" TextAlignment="Right" VerticalAlignment="Center" />  

在回答后添加了备注:

  • UpdateSourceTrigger = PropertyChanged 似乎与此行为直接相关。
  • 我怀疑真正的完整解决方案可能是不可能的,因为逻辑冲突是希望两者都进行真正的双向更新,并且用户试图同时干预新输入。

1 个答案:

答案 0 :(得分:1)

在XAML中设置事件处理程序的方式解释了TextBox1控件行为:UpdateSourceTrigger=PropertyChanged设置默认行为,这意味着源控件(TextBox1)在该绑定上更新财产变化。您可以考虑其他TextBox事件,例如LostFocusTextChanged,如下所示(C#):

TextBox1.LostFocus += (s, e) => TextBox_LostFocus(s, e);
TextBox1.TextChanged += (s, e) => TextBox_TextChanged(s, e);

private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
// Your event handling procedure, Formatting, etc.
}

private void TextBox_TextChanged(object sender, RoutedEventArgs e)
{
// Your event handling procedure, Formatting, etc.
}

或使用Lambda风格的简化紧凑语法:

TextBox1.LostFocus += (s, e) => {//Your procedure, Formatting, etc};
TextBox1.TextChanged += (s, e) => {//Your procedure, Formatting, etc};

同样也可以在XAML中声明,但我建议在代码隐藏模块中实现该功能。

关于你的第二个问题,即CultureInfo实现:你可以在XAML中保留CultureInfo声明,或者在代码隐藏模块中实现它,将它放在任何上述事件的处理程序中,例如(re:Changing the default thousand and decimal separator in a binding作者:Andrey Gordeev):

String.Format(new CultureInfo("de-DE"), "{0:N}", valueTypeDouble);

希望这可能会有所帮助。