AXG*_*010 82 data-binding wpf xaml string-formatting
我正在编写一个WPF程序,我试图通过一些可重复的方法(如样式或模板)找出一种在TextBox中格式化数据的方法.我有很多TextBoxes(确切地说是95),每一个都绑定到自己的数值数据,每个数据都可以定义自己的分辨率.例如,如果数据为99.123,分辨率为2,则应显示99.12.同样,数据值99和分辨率3应显示为99.000(而不是99).有没有办法做到这一点?
编辑: 我应该澄清一下,我正在处理的当前屏幕上有95个TextBox,但我希望程序中各个屏幕的每个TextBox都能显示正确的小数位数.现在我考虑一下,其中一些是TextBoxes(就像我现在正在处理的屏幕),有些是DataGrids或ListViews,但是如果我能弄清楚如何使它适用于TextBoxes我敢肯定我可以想象它也用于其他控件.
在这种情况下,没有太多的代码可以共享,但我会尝试使其更清晰:
我有一个View Model,它包含以下属性(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
Run Code Online (Sandbox Code Playgroud)
在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}" />
Run Code Online (Sandbox Code Playgroud)
EDIT2(我的解决方案): 事实证明,在离开电脑一段时间之后,我回来找到一个简单的答案,盯着我的脸.格式化视图模型中的数据!
Public ReadOnly Property Value As String
Get
Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
End Get
End Property
Run Code Online (Sandbox Code Playgroud)
Abe*_*cht 172
你应该使用StringFormat上Binding.您可以使用标准字符串格式或自定义字符串格式:
<TextBox Text="{Binding Value, StringFormat=N2}" />
<TextBox Text="{Binding Value, StringFormat={}{0:#,#.00}}" />
Run Code Online (Sandbox Code Playgroud)
请注意,StringFormat仅当target属性为string类型时才有效.如果您尝试设置类似Content属性(typeof(object))的东西,则需要使用自定义StringFormatConverter(如此处),并将格式字符串作为ConverterParameter.
编辑更新的问题
所以,如果你ViewModel定义精度,我建议你做这个MultiBinding,并创建自己的IMultiValueConverter.这在实践中非常烦人,从简单的绑定转变为需要扩展到a的绑定MultiBinding,但如果在编译时不知道精度,那么这就是你所能做的.您IMultiValueConverter需要获取值和精度,并输出格式化的字符串.你可以用它来做到这一点String.Format.
但是,对于像a这样的东西ContentControl,你可以更容易地做到这一点Style:
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentStringFormat"
Value="{Binding Resolution, StringFormat=N{0}}" />
</Style>
Run Code Online (Sandbox Code Playgroud)
暴露a的任何控件ContentStringFormat都可以像这样使用.不幸的是,TextBox没有那样的东西.
在给出0.299的输入时,接受的答案在整数位置不显示0.它在WPF UI中显示.3.所以我建议使用以下字符串格式
<TextBox Text="{Binding Value, StringFormat={}{0:#,0.0}}"
Run Code Online (Sandbox Code Playgroud)