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)
在我的应用程序中,我正在处理货币价值,但精确到美分就足够了。因此,我决定将所有金额存储为以美分为单位的整数。但是当我将一个值绑定到 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)