How to format number of decimal places in wpf using style/template?

后端 未结 3 595
再見小時候
再見小時候 2020-11-29 01:13

I am writing a WPF program and I am trying to figure out a way to format data in a TextBox through some repeatable method like a style or template. I have a lot of TextBoxes

相关标签:
3条回答
  • 2020-11-29 01:27
        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;
            }
        }
    
    0 讨论(0)
  • 2020-11-29 01:32

    You should use the StringFormat on the Binding. You can use either standard string formats, or custom string formats:

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

    Note that the StringFormat only works when the target property is of type string. If you are trying to set something like a Content property (typeof(object)), you will need to use a custom StringFormatConverter (like here), and pass your format string as the ConverterParameter.

    Edit for updated question

    So, if your ViewModel defines the precision, I'd recommend doing this as a MultiBinding, and creating your own IMultiValueConverter. This is pretty annoying in practice, to go from a simple binding to one that needs to be expanded out to a MultiBinding, but if the precision isn't known at compile time, this is pretty much all you can do. Your IMultiValueConverter would need to take the value, and the precision, and output the formatted string. You'd be able to do this using String.Format.

    However, for things like a ContentControl, you can much more easily do this with a Style:

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

    Any control that exposes a ContentStringFormat can be used like this. Unfortunately, TextBox doesn't have anything like that.

    0 讨论(0)
  • 2020-11-29 01:42

    The accepted answer does not show 0 in integer place on giving input like 0.299. It shows .3 in WPF UI. So my suggestion to use following string format

    <TextBox Text="{Binding Value,  StringFormat={}{0:#,0.0}}" 
    
    0 讨论(0)
提交回复
热议问题