【问题标题】:WPF TextBox Binding PercentageWPF 文本框绑定百分比
【发布时间】:2012-08-27 08:32:27
【问题描述】:

我必须将 TextBox 绑定到 % 值。所以我像这样在 Binding 上设置 StringFormat 属性:

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

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

【问题讨论】:

  • ok 找到了解决办法 StringFormat={}{0:F2}%
  • 您能否发布您的解决方案作为答案并接受它?供日后参考

标签: c# wpf format


【解决方案1】:

如果您只使用像{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”)如何只限制显示的小数位数,而不限制传递给底层绑定源的小数位数。 em>

【讨论】:

  • 这太棒了,我一直在努力寻找一个体面的解决方案来解决这个问题。谢谢!
【解决方案2】:

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

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

double fraction;
double percentage;
if (double.TryParse(value, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out percentage))
{
    fraction = percentage / 100d;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2012-11-24
    • 2015-10-16
    • 2011-03-29
    • 2010-12-20
    相关资源
    最近更新 更多