4

我必须将 TextBox 绑定到 % 值。所以我在 Binding 上设置 StringFormat 属性,如下所示:

<TextBox Text="{Binding Path=BewertungsFaktore.Gewinn, StringFormat=P2, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource TextBoxStyle}" HorizontalAlignment="Left"/>

这似乎工作得很好。但是,如果我编辑该值,则会出现问题。例如,如果我输入值 1,则文本框应将其格式化为 1%。但主要问题是它格式化为 100.00%。另一个问题是,如果我使用的是德语系统,我是否必须输入“,”而不是“。”?

4

2 回答 2

6

如果你只使用这样的字符串格式,{0:F2}%你将不得不忍受像 4.23 这样的数据库值来表示 4.23%,这对我来说是不可接受的(直到他们在 SQL Server 中引入“百分比”数据类型)。

我创建了以下值转换器来将 TextBox 中的百分比值(例如 4.2367%)映射到数据库值(例如 0.042367)中:

public class PercentageConverter : IValueConverter
{
    //E.g. DB 0.042367 --> UI "4.24 %"
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var fraction = decimal.Parse(value.ToString());
        return fraction.ToString("P2");
    }

    //E.g. UI "4.2367 %" --> DB 0.042367
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //Trim any trailing percentage symbol that the user MAY have included
        var valueWithoutPercentage = value.ToString().TrimEnd(' ', '%');
        return decimal.Parse(valueWithoutPercentage)/100;
    }
}

请注意格式化字符串(在本例中为“P2”)如何仅限制显示多少小数位,而不限制多少小数位传递给底层绑定源。

于 2013-05-29T04:52:18.410 回答
3

StringFormat属性仅控制绑定值的输出字符串。“P2”只是将该值乘以 100,并用两个十进制数字和一个尾随的“%”对其进行格式化。在输入时,此格式将被忽略。

如果您还需要输入百分比值,则必须使用绑定转换器。这样的转换器还可以像这样以文化不变的方式解析输入字符串:

double fraction;
double percentage;
if (double.TryParse(value, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out percentage))
{
    fraction = percentage / 100d;
}
于 2012-08-27T08:48:45.623 回答