我一直在寻找一种处理百分比的好方法。在我们的应用程序中,我们需要使用不同的小数位数显示和编辑百分比值,即当用户当前不关注文本框时,它应该显示 12.50%,但在编辑该值时,它应该显示为 0.12501015512312311。更糟糕的是,用户应该能够选择在运行时显示的小数位数。此外,应该允许用户输入 12.5%,这将转换为 0.125。我知道我可以使用转换器来做到这一点,但是我无法将所有这些要求组合成一个体面的解决方案。
这是我迄今为止最好的尝试:
public class PercentConverter : IValueConverter
{
private static int numberOfDecimals = CultureInfo.CurrentCulture.NumberFormat.PercentDecimalDigits;
public static int NumberOfDecimals
{
get { return numberOfDecimals; }
set
{
if(value != numberOfDecimals)
{
numberOfDecimals = value;
}
}
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
decimal pct = System.Convert.ToDecimal(value);
CultureInfo ci = new CultureInfo(CultureInfo.CurrentCulture.Name, false);
ci.NumberFormat.PercentDecimalDigits = NumberOfDecimals;
return String.Format(ci, "{0:P}", pct);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string percentString = value as string;
string doubleString = percentString.TrimEnd(culture.NumberFormat.PercentSymbol.ToCharArray());
double percent = Double.Parse(doubleString, NumberStyles.Any);
if (IsExplicitPercentage(percentString, culture))
{
percent /= 100;
}
return percent;
}
private bool IsExplicitPercentage(string percentString, CultureInfo culture)
{
return percentString.Contains(culture.NumberFormat.PercentSymbol);
}
}
然后在 xaml
<DataGrid.Columns>
<DataGridTextColumn Header="Beskrivelse" Binding="{Binding Description}" />
<DataGridTemplateColumn Header="Share">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox HorizontalContentAlignment="Right" HorizontalAlignment="Stretch">
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<!-- Other Style Setters -->
<Setter Property="Text" Value="{Binding Share, Converter={StaticResource pctConverter}}" />
<Style.Triggers>
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter Property="Text" Value="{Binding Share}" />
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
但这不会正确绑定到数据上下文,当我更改文本框中的值时,它不会更新它绑定到的模型上的属性。
请注意,我对 WPF 很陌生,所以我可能会遗漏一些基本的东西。