StringFormat,除以 100(或任何自定义比例)

StringFormat, divide by 100 (or any custom scaling)

在我的应用程序中,我正在处理货币价值,但精确到美分就足够了。因此,我决定将所有金额存储为以美分为单位的整数。但是当我将一个值绑定到 Xaml 时,我想使用

之类的东西来查看以美元为单位的值
<TextBlock Text="{Binding Product.Price, StringFormat={}{***}}"/>

其中 *** 应替换为适当的内容。我通读了文档 http://msdn.microsoft.com/en-us/library/vstudio/0c899ak8(v=vs.100).aspx

其中有除以 1000(使用“,”)、乘以 100(使用“%”)等的示例。有没有办法在 [=11= 中进行自定义缩放(如除以 100) ],还是真的必须编写自定义值转换器?

除了您提到的那些操作(按 1000 缩放,或执行百分比或千位转换)之外,无法使用格式字符串进行 "custom" 缩放。

您可以使用 Converter 来解决它,或者如果您打算在其他地方使用它(这不是一个非常具体的情况),您可能需要添加一个 属性给你的 Product,比如:

decimal PriceInDollars { get { return Price / 100; }

请记住,如果需要,也请为此 属性 通知您对 Price 的更改。

如果您想走 Converter 路线,并且想要一些多功能的东西,您可能想试试这个:http://www.codeproject.com/Articles/239251/MathConverter-How-to-Do-Math-in-XAML 或散布在网络上的许多其他东西之一(搜索一些东西像 "Math Converter WPF",有很多)。无需从头开始编写自己的代码。

使用我链接的那个(我根本没有关联),比如:

<!-- somewhere in resources -->
<ikriv:MathConverter x:Key="MathConverter" />

然后:

<TextBlock Text="{Binding Product.Price, 
                  Converter={StaticResource MathConverter},
                  ConverterParameter=x/100}"/>

根据建议我写了一个非常简单的ValueConverter,即

public class CentConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {

        if (targetType != typeof(string)) throw new NotImplementedException();
        var valueInCents = Int32.Parse(value.ToString());
        return String.Format("{0:C}", (double)valueInCents / 100);

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException();
    }
}

因为我知道我总是只想在转换为字符串的上下文中使用它,而且我永远不需要转换回来。如果有转换器的强类型版本(或者更好,更具体地类型化为 object 类型),那就太好了,例如,使用下面的方法签名,这样就可以摆脱强制转换,

public string Convert(int value, object parameter, CultureInfo culture)