102

我正在编写一个 WPF 程序,并且我试图找出一种通过一些可重复的方法(如样式或模板)来格式化 TextBox 中的数据的方法。我有很多文本框(准确地说是 95 个),每个文本框都绑定到自己的数字数据,每个数字数据都可以定义自己的分辨率。例如,如果数据为 99.123,分辨率为 2,则应显示 99.12。同样,数据值 99 和分辨率 3 应显示为 99.000(不是 99)。有没有办法做到这一点?

编辑: 我应该澄清一下,我正在处理的当前屏幕上有 95 个文本框,但我希望程序中各个屏幕上的每个文本框都能显示正确的小数位数。现在我想起来了,其中一些是文本框(比如我现在正在处理的屏幕),还有一些是 DataGrids 或 ListViews,但如果我能弄清楚如何让它为 TextBoxes 工作,我相信我能想出它也适用于其他控件。

在这种情况下没有太多代码可以分享,但我会尽量让它更清楚:

我有一个视图模型,其中包含以下属性(vb.net):

    Public ReadOnly Property Resolution As Integer
        Get
            Return _signal.DisplayResolution
        End Get
    End Property

    Public ReadOnly Property Value As Single
        Get
            Return Math.Round(_signal.DisplayValue, Resolution)
        End Get
    End Property

在 XAML 中我有:

<UserControl.Resources>
    <vm:SignalViewModel x:Key="Signal" SignalPath="SomeSignal"/>
</UserControl.Resources>
<TextBox Grid.Column="3" IsEnabled="False" Text="{Binding Path=Value, Source={StaticResource Signal}, Mode=OneWay}" />

EDIT2(我的解决方案): 事实证明,在离开电脑一段时间后,我回来发现一个简单的答案,正盯着我看。格式化视图模型中的数据!

    Public ReadOnly Property Value As String
        Get
            Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
        End Get
    End Property
4

3 回答 3

218

您应该StringFormatBinding. 您可以使用标准字符串格式自定义字符串格式

<TextBox Text="{Binding Value, StringFormat=N2}" />
<TextBox Text="{Binding Value, StringFormat={}{0:#,#.00}}" />

请注意,StringFormat仅当目标属性为字符串类型时才有效。如果您尝试设置Content属性 ( typeof(object)) 之类的内容,则需要使用自定义StringFormatConverter(如此处),并将格式字符串作为ConverterParameter.

编辑更新的问题

因此,如果您ViewModel定义了精度,我建议您将其作为MultiBinding,并创建您自己的IMultiValueConverter. 这在实践中非常烦人,从一个简单的绑定到一个需要扩展为 a 的绑定MultiBinding,但如果在编译时不知道精度,这几乎是你能做的。您IMultiValueConverter需要获取值和精度,并输出格式化的字符串。您可以使用String.Format.

但是,对于 a 之类的东西ContentControl,您可以使用 a 更轻松地做到这一点Style

<Style TargetType="{x:Type ContentControl}">
    <Setter Property="ContentStringFormat" 
            Value="{Binding Resolution, StringFormat=N{0}}" />
</Style>

任何公开 a 的控件ContentStringFormat都可以这样使用。不幸的是,TextBox没有这样的东西。

于 2013-08-21T16:27:40.603 回答
9

接受的答案在给出 0.299 之类的输入时不会在整数位置显示 0。它在 WPF UI 中显示 .3。所以我建议使用以下字符串格式

<TextBox Text="{Binding Value,  StringFormat={}{0:#,0.0}}" 
于 2018-01-04T09:37:23.280 回答
-2
    void NumericTextBoxInput(object sender, TextCompositionEventArgs e)
    {
        TextBox txt = (TextBox)sender;
        var regex = new Regex(@"^[0-9]*(?:\.[0-9]{0,1})?$");
        string str = txt.Text + e.Text.ToString();
        int cntPrc = 0;
        if (str.Contains('.'))
        {
            string[] tokens = str.Split('.');
            if (tokens.Count() > 0)
            {
                string result = tokens[1];
                char[] prc = result.ToCharArray();
                cntPrc = prc.Count();
            }
        }
        if (regex.IsMatch(e.Text) && !(e.Text == "." && ((TextBox)sender).Text.Contains(e.Text)) && (cntPrc < 3))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }
于 2017-06-05T11:55:43.143 回答