如何在不绑定的情况下按数字分隔文本框的内容?

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>

推荐阅读: