如何为多个文本框使用一个绑定来分隔 WPF XAML 中的三位数字?

Posted

技术标签:

【中文标题】如何为多个文本框使用一个绑定来分隔 WPF XAML 中的三位数字?【英文标题】:How do I use one binding for multiple text boxes to separate three-digit numbers in WPF XAML? 【发布时间】:2022-01-07 23:44:50 【问题描述】:

我在 Visual Studio 2019 中使用 C# WPF

我想将我的 TextBoxes 值显示为像这样分隔的千位小数 1500.9 => 1,500.9

我选择 Validation Rules and Binding 来解决这个问题,因为我不想使用 C# Code Behind,另外一点是这个选项本身对文本框没有任何作用

 StringFormat="0,0.0" 

我的问题是什么

我认为验证规则中的绑定使用这种类型的属性进行格式化, 我确实将所有文本框绑定到我的属性,现在所有文本框都具有相同的值,即使我更改了其中一个 enter image description here

我的项目

这是我的模型名称Validator.cs

namespace WpfApp5

    public class Validator
    
        public double dbl_numeric  get; set; 
    

我的文本框绑定窗口:

<Window x:Class="WpfApp5.Budget_Default"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:gif="http://wpfanimatedgif.codeplex.com"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp5"
        mc:Ignorable="d"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
          
           xmlns:validate="clr-namespace:WpfApp5.Validation"
             
        AllowDrop="True"
        Height="550" Width="1033" >
    <Grid x:Name="mygrid">   
                 
         <TextBox x:Name="TextBox1"  >
            <Binding Path = "dbl_numeric" UpdateSourceTrigger = "PropertyChanged" StringFormat="0,0.0">
                <Binding.ValidationRules>
                    <ExceptionValidationRule ValidatesOnTargetUpdated = "True"/>
                    <validate:RequeredViladation/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox>
        
         <TextBox x:Name="TextBox2"  >
            <Binding Path = "dbl_numeric" UpdateSourceTrigger = "PropertyChanged" StringFormat="0,0.0">
                <Binding.ValidationRules>
                    <ExceptionValidationRule ValidatesOnTargetUpdated = "True"/>
                    <validate:RequeredViladation/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox>
        
          <TextBox x:Name="TextBox3"  >
            <Binding Path = "dbl_numeric" UpdateSourceTrigger = "PropertyChanged" StringFormat="0,0.0">
                <Binding.ValidationRules>
                    <ExceptionValidationRule ValidatesOnTargetUpdated = "True"/>
                    <validate:RequeredViladation/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox>
</Grid>

我需要什么

如何使用验证规则或其他东西来显示数千个分隔的十进制数字,以便为我的文本框使用字符串格式

长话短说:每个文本框应该分成 3 位数字,3 位数字只代表它自己的值

1500.9 => 1,500.9

【问题讨论】:

【参考方案1】:

如果您只想格式化绑定到文本框的值,这就足够了:

<TextBox Text="Binding Path=dbl_numeric,StringFormat=0:N2" />

这将为您提供一个特定于文化的分隔符,用于千位和两位小数。

验证是另一个主题。请注意,开箱即用,WPF 将检查一个值是否可以解析为双精度值,并在文本框周围放置一个红色边框,例如,如果您输入文本。如果您希望允许用户在验证之前输入完整的值,您可能需要将 UpdateSourceTrigger 设置为 LostFocus。如果您有其他验证需求,则必须手动添加。

您的三个文本框当前都绑定到模型中的相同值(通常是 WPF 中的视图模型)。

【讨论】:

感谢您的回答,那么如果只有 3 位数字分隔 3 位数字但值不一样,我该怎么办?我不希望他们我不希望他们都具有相同的价值 有没有办法只格式化一个文本框字符串?无绑定 我认为没有绑定会更难实现格式化;事实上,WPF 已为此设计,以便在绑定中发挥最佳功能。首先,WPF 被设计为使用(视图)模型和视图之间的绑定。我不确定您的第一条评论;您可以简单地在您的(视图)模型上声明三个属性并将它们中的每一个绑定到一个单独的文本框。 谢谢,我做了你伤心的事,但现在当我输入数字时,选择开始无法正常工作 选择开始是什么意思?

以上是关于如何为多个文本框使用一个绑定来分隔 WPF XAML 中的三位数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何为文本框设置数据类型[重复]

WPf:一次绑定多个属性

WPF组合框值和显示文本

使用 `let` 绑定来增加值的生命周期

ngFor 无法通过与 @Input 的组件绑定来迭代另一个组件

如何在 Android 中使用数据绑定来绑定 layout_width 和 layout_height