.net “双”字;1/3“;as转换器参数
我必须使用转换器和参数将双精度转换为其他值: 这是我的XAML存根:.net “双”字;1/3“;as转换器参数,.net,wpf,xaml,converter,.net,Wpf,Xaml,Converter,我必须使用转换器和参数将双精度转换为其他值: 这是我的XAML存根: Converter={StaticResource ToOtherDoubleConverter}, ConverterParameter=-1/2 这是转换器: [ValueConversion(typeof(double), typeof(double))] public class DoubleToOtherDoubleConverter : IValueConverter { public object Co
Converter={StaticResource ToOtherDoubleConverter}, ConverterParameter=-1/2
这是转换器:
[ValueConversion(typeof(double), typeof(double))]
public class DoubleToOtherDoubleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
return (double)value * double.Parse(parameter.ToString());
}
现在,说这是文化依赖是没有用的,等等
有没有一种方法可以将double“硬编码”为double?
因为上述变体可以用不同的方式书写,例如:
ConverterParameter=-1/2
ConverterParameter=-0.5
ConverterParameter=-0,5
etc.
或者也
double.Parse(parameter.ToString());
(double)parameter;
等等
还有一个问题:
如何以浮动格式指定1/3
?差不多
ConverterParameter=0.333333333333333333333333333333333333333333333333333333
不幸的是,IValueConverter接口提供了接受对象(不是类型保存)而不是泛型的方法。
但是您可以将Culture.InvariantCulture添加到解析中并引发异常。这样,您就可以通知用户“不正确”的格式。试试这个
public class DoubleToOtherDoubleConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var frac = ((string) parameter).Split('/');
if (frac.Length == 2)
return (double) value*double.Parse
(frac[0])/double.Parse(frac[1]);
return (double) value* double.Parse(((string) parameter)
.Replace(",", "."));
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
您确定它是作为数值传入的吗?根据我的经验,大多数XAML值最终都会以字符串的形式传递,即使它们看起来像数字…@Dan Puzey:as
object
。。。作为字符串,也许最后,这就是我问的原因,因为我不知道:)如果您在转换器的第一行上放置断点,您可以检查value.GetType()
,并查看它被传递为什么…@Dan:have reason:parameter.GetType(){Name=“String”FullName=“System.String”}System.Type{System.RuntimeType}
你不能。1/3不是一个数字,它是一个算术表达式。出于您的目的,我将创建两个转换器->乘法器转换器和除法器转换器。您也可以反转逻辑并创建一个除法器转换器,但这会使您的xaml更具可读性…:)最后,这是我不喜欢的“硬”变体。但因为这是唯一对我有效的方法,我别无选择。我在最后添加了CultureInfo.InvariantCulture。