首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用样式/模板格式化wpf中的小数位数?

如何使用样式/模板格式化wpf中的小数位数?
EN

Stack Overflow用户
提问于 2013-08-21 23:33:11
回答 3查看 212.9K关注 0票数 97

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

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

在这种情况下,没有太多代码可供共享,但我将尝试使其更清晰:

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

代码语言:javascript
复制
    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中,我有:

代码语言:javascript
复制
<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 (我的解决方案):事实证明,在离开电脑一段时间后,我回来了,发现了一个简单的答案,它就在我面前。格式化视图模型中的数据!

代码语言:javascript
复制
    Public ReadOnly Property Value As String
        Get
            Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
        End Get
    End Property
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-22 00:27:41

您应该在Binding上使用StringFormat。您可以使用standard string formatscustom string formats

代码语言:javascript
复制
<TextBox Text="{Binding Value, StringFormat=N2}" />
<TextBox Text="{Binding Value, StringFormat={}{0:#,#.00}}" />

请注意,StringFormat仅在目标属性的类型为字符串时才起作用。如果您正在尝试设置类似Content属性(typeof(object))的内容,则需要使用自定义StringFormatConverter (like here),并将格式字符串作为ConverterParameter进行传递。

更新的问题的编辑

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

但是,对于像ContentControl这样的东西,您可以使用Style更容易地做到这一点

代码语言:javascript
复制
<Style TargetType="{x:Type ContentControl}">
    <Setter Property="ContentStringFormat" 
            Value="{Binding Resolution, StringFormat=N{0}}" />
</Style>

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

票数 213
EN

Stack Overflow用户

发布于 2018-01-04 17:37:23

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

代码语言:javascript
复制
<TextBox Text="{Binding Value,  StringFormat={}{0:#,0.0}}" 
票数 9
EN

Stack Overflow用户

发布于 2017-06-05 19:55:43

代码语言:javascript
复制
    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;
        }
    }
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18361689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档