1

我的 ViewModel 上有一个 double 值,并且想要绑定一个 TextBlock 的文本,例如:

128228.094545 被格式化为 128228[x]09,其中 [x] 是根据计算机的文化设置的小数分隔符。

我试过了:

Text="{Binding Value, StringFormat='{}{0:F2}'}"

不起作用:无论使用正确的小数分隔符,该值都会显示为 128228.09。

Text="{Binding Value, StringFormat='{}{0:N2}'}"

呈现我不想要的数字分组符号([d],y in en-US):128[d]228[x]09

Text="{Binding Value, StringFormat='{}{0:0.00}'}"

显然行不通。

什么是正确的格式字符串?

4

2 回答 2

1

我认为你的第一个定义是正确的。问题是格式化总是根据设置的文化来完成的。不知道您到底在使用什么,但这取决于如何为您的应用设置文化。

这是一篇很棒的博客文章,为 WPF 描述了它,因为手动定义文化存在一些问题......

http://www.west-wind.com/weblog/posts/2009/Jun/14/WPF-Bindings-and-CurrentCulture-Formatting

于 2013-09-24T12:50:56.120 回答
1

我认为问题在于,当在数据绑定中使用 StringFormat 时,它不尊重当前的文化。

在过去,我使用了一个简单的IValueConverter来格式化值。如果您的应用程序允许用户指定所有数字的格式选项,例如小数位数,这将很有用。或者,您可以使用 ConverterParameter 指定格式字符串并简单地返回:

String.Format(CultureInfo.CurrentCulture, converterParameter, value)

如果您不需要用前缀或后缀包围值,则以下转换器应允许您与格式化值相互转换:

public class StringFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        var parameterString = parameter as string;
        if (value != null && parameterString != null)
        {
            return String.Format(CultureInfo.CurrentCulture, "{0:"+ parameterString + "}", value);
        }
        else
        {           
            return string.Empty;
        }
    }


    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        if (targetType == typeof (double))
        {
            return System.Convert.ToDouble(value, CultureInfo.CurrentCulture);
        }
        else if (targetType == typeof(int))
        {
            return System.Convert.ToInt32(value, CultureInfo.CurrentCulture);
        }
        // Any other supported types
        else
        {
            throw new NotImplementedException();
        }
    }
}
于 2013-09-24T12:59:21.883 回答