如何在不绑定的情况下按数字分隔文本框的内容?
How do I separate the content of a textbox by number without binding?
我想在带有千位分隔符的 TextBox 中显示数字 没有 绑定它并且没有以编程方式。
就在XAML.
像这个例子:
123456 => 123,456 or 1000000000 => 1,000,000,000
XAML 中的这一行也有错误:
<TextBox x:Name="text_main2" Text="{Binding StringFormat={}{0:N0}}" VerticalAlignment="Top" Width="303"/>
而且我不能,我不能在 TextBoxMask 中完成这项工作:
<xctk:MaskedTextBox Mask="0000" PromptChar=" " x:Name="txtname" HorizontalContentAlignment="Right" HorizontalAlignment="Left" Height="22" Margin="512,296,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="152"/>
请帮忙
一般情况下,如果不绑定或编写额外的代码,就无法做到这一点。 TextBox 没有内置 text/input 格式。
但是在适当的 WPF 应用程序中,您总是会使用数据绑定来将用户输入发送到处理输入的模型,因此使用 Binding.StringFormat
格式化显示值是一种直接的解决方案并且非常灵活.它允许在不修改实际值(数据)的情况下格式化显示值。
另一个只允许修改显示值而不是实际数据的解决方案是实现一个 IValueConverter
并将其分配给 Binding.Converter
.
其他选项涉及子类化 TextBox
(如您的 MaskedTextBox
类型)或创建附加行为。目标应该是在不修改实际值的情况下格式化数字以供显示。
要修复您遇到的错误,我建议修复您的绑定。你没有解释你得到什么样的错误。但至少你的 Binding 需要修复。
您不能只设置 属性 StringFormat。这不是 MarkupExtensions 的工作方式。 Binding MarkupExtension 有一个需要 Binding.Path 值的构造函数(除非您使用使用默认值的默认构造函数,它解析为当前 DataContext)。不能省略。
因此,如果您想在不指定路径的情况下在 Bindng 上设置 属性(因为您想使用 DataContex 的隐式绑定源,您可以使用“.”(句点)表示法:
{Binding}
等价于 {Binding Path=.}
.
因此,要修复绑定表达式,它应该是:
<TextBox Text="{Binding Path=., StringFormat={}{0:N0}}" />
例子
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public static readonly DependencyProperty NumericValueProperty = DependencyProperty.Registe(
"NumericValue",
typeof(int),
typeof(MainWindow),
new PropertyMetadata(default(int), MainWindow.OnNumericValueChanged));
public int NumericValue
{
get => (int) GetValue(MainWindow.NumericValueProperty);
set => SetValue(MainWindow.NumericValueProperty, value);
}
// Property changed callbacck
private static void OnNumericValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var textBox = d as TextBox;
int newValue = (int) e.NewValue;
// Do something with the new value that was entered by the user
}
public MainWindow()
{
InitializeComponent();
// Set DataContext to the MainWindow itself
this.DataContext = this;
// We want 10000 to be displayed with thousands number groups
// like '10.000'
this.NumericValue = 10000;
}
}
MainWindow.xaml
<Window>
<!-- Display number with thousands groups. Note that 'N0' will truncate decimal places (zero deimal places) -->
<TextBox Text="{Binding NumericValue, StringFormat={}{0:N0}}" />
</Window>
推荐阅读:
我想在带有千位分隔符的 TextBox 中显示数字 没有 绑定它并且没有以编程方式。
就在XAML.
像这个例子:
123456 => 123,456 or 1000000000 => 1,000,000,000
XAML 中的这一行也有错误:
<TextBox x:Name="text_main2" Text="{Binding StringFormat={}{0:N0}}" VerticalAlignment="Top" Width="303"/>
而且我不能,我不能在 TextBoxMask 中完成这项工作:
<xctk:MaskedTextBox Mask="0000" PromptChar=" " x:Name="txtname" HorizontalContentAlignment="Right" HorizontalAlignment="Left" Height="22" Margin="512,296,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="152"/>
请帮忙
一般情况下,如果不绑定或编写额外的代码,就无法做到这一点。 TextBox 没有内置 text/input 格式。
但是在适当的 WPF 应用程序中,您总是会使用数据绑定来将用户输入发送到处理输入的模型,因此使用 Binding.StringFormat
格式化显示值是一种直接的解决方案并且非常灵活.它允许在不修改实际值(数据)的情况下格式化显示值。
另一个只允许修改显示值而不是实际数据的解决方案是实现一个 IValueConverter
并将其分配给 Binding.Converter
.
其他选项涉及子类化 TextBox
(如您的 MaskedTextBox
类型)或创建附加行为。目标应该是在不修改实际值的情况下格式化数字以供显示。
要修复您遇到的错误,我建议修复您的绑定。你没有解释你得到什么样的错误。但至少你的 Binding 需要修复。
您不能只设置 属性 StringFormat。这不是 MarkupExtensions 的工作方式。 Binding MarkupExtension 有一个需要 Binding.Path 值的构造函数(除非您使用使用默认值的默认构造函数,它解析为当前 DataContext)。不能省略。
因此,如果您想在不指定路径的情况下在 Bindng 上设置 属性(因为您想使用 DataContex 的隐式绑定源,您可以使用“.”(句点)表示法:
{Binding}
等价于 {Binding Path=.}
.
因此,要修复绑定表达式,它应该是:
<TextBox Text="{Binding Path=., StringFormat={}{0:N0}}" />
例子
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public static readonly DependencyProperty NumericValueProperty = DependencyProperty.Registe(
"NumericValue",
typeof(int),
typeof(MainWindow),
new PropertyMetadata(default(int), MainWindow.OnNumericValueChanged));
public int NumericValue
{
get => (int) GetValue(MainWindow.NumericValueProperty);
set => SetValue(MainWindow.NumericValueProperty, value);
}
// Property changed callbacck
private static void OnNumericValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var textBox = d as TextBox;
int newValue = (int) e.NewValue;
// Do something with the new value that was entered by the user
}
public MainWindow()
{
InitializeComponent();
// Set DataContext to the MainWindow itself
this.DataContext = this;
// We want 10000 to be displayed with thousands number groups
// like '10.000'
this.NumericValue = 10000;
}
}
MainWindow.xaml
<Window>
<!-- Display number with thousands groups. Note that 'N0' will truncate decimal places (zero deimal places) -->
<TextBox Text="{Binding NumericValue, StringFormat={}{0:N0}}" />
</Window>
推荐阅读: