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

我正在写一个WPF程序,我想通过一些可重复的方法(如样式或模板)来devise一个格式化文本框中的数据的方法。 我有很多TextBoxes(精确到95),每个绑定到自己的数字数据,每个数据都可以定义自己的分辨率。 例如,如果数据是99.123,分辨率是2,那么它应该显示99.12。 同样,数据值99和分辨率3应该显示为99.000(不是99)。 有没有办法做到这一点?

编辑:我应该澄清,目前的屏幕上有95个文本框正在工作,但我希望每个文本框在我的程序中的各种屏幕上显示正确的小数位数。 现在我想起来了,其中一些是TextBoxes(就像我现在正在使用的屏幕一样),一些是DataGrids或者ListViews,但是如果我能弄清楚如何让它在TextBox中工作,我相信我可以它也用于其他控制。

在这种情况下没有太多的代码可以分享,但是我会试图使它更清晰:

我有一个视图模型,其中包含以下属性(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}" /> 

编辑2(我的解决scheme):事实certificate,离开电脑一段时间后,我回来find一个简单的答案,正在盯着我的脸。 格式化视图模型中的数据!

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

您应该在Binding上使用StringFormat 。 您可以使用标准string格式或自定义string格式 :

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

请注意,只有当目标属性是stringtypes时, StringFormat才起作用。 如果你想设置Content属性( typeof(object) ),你将需要使用一个自定义的StringFormatConverter ( 就像这里 ),并将你的格式string作为ConverterParameter传递。

编辑更新的问题

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

但是,对于ContentControl类的东西,使用Style可以更简单地完成此操作:

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

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

  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; } }