我想解决我一直以来的一个小怪癖。这不是一个真正的怪癖,而是一种我想要改变的行为。
如果我使用{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" />
在回答后添加了备注:
答案 0 :(得分:1)
在XAML中设置事件处理程序的方式解释了TextBox1
控件行为:UpdateSourceTrigger=PropertyChanged
设置默认行为,这意味着源控件(TextBox1
)在该绑定上更新财产变化。您可以考虑其他TextBox
事件,例如LostFocus
和TextChanged
,如下所示(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);
希望这可能会有所帮助。