我正试图在WPF,C#中设置一个IValueConverter。这个转换器的目的是取传入的值除以100,这样我们就可以得到一个二重。在启动之前,我没有在代码中看到任何错误,但当我去测试它时,我得到了以下错误:
系统。InvalidCastException:"指定的强制转换无效。">
这是转换器的代码:
public class DecimalPlace : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return System.Convert.ToDouble(value) / 100.00;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
- 值=5
- targetType={Name="String"FullName="System.String"}
我不确定为什么我不能将值转换为double来进行所需的数学
这就是我所说的:
<DataGridTextColumn Header="Price" Width="2*" Binding="{Binding intPrice, Converter={StaticResource DecimalPlace}, StringFormat='{}{0:C0}'}"/>
我的猜测是targetType是string
,并且异常实际上并没有发生在您的代码中(您忽略了发布stacktrace(。它被绑定到一个需要字符串的DataGridTextColumn
。因此,转换器必须返回一个字符串。通常,当从源到目标时,WPF会自动处理绑定中string
和double
等类型之间的转换,反之亦然,但如果您指定了自己的转换器,则必须确保提供正确的返回类型。
简单的修复方法是:
public class DecimalPlace : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (System.Convert.ToDouble(value) / 100.00).ToString();
}
}
但是,如果你想要一个更通用的有用转换器,你需要检查targetType
并转换为正确的类型(你可能使用TypeDescriptor.GetConverter
请在使用此转换器的地方包含Xaml。我的猜测是,您最初在文本框中使用空字符串。尝试将回退值应用于0。您应该在转换器代码中检查您的输入值实际上可以被解析为数字,例如使用double。TryParse!
<TextBox Text=“{Binding MyNumberInViewModel, Mode=Twoway, Fallbackvalue=‘0’}” />
另一种变体,对缺失的验证更有弹性。
public class DecimalPlace : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double parsed=0;
if (!double.TryParse(out parsed))
return parsed;
return (parsed) / 100.00;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
double parsed=0;
if (!double.TryParse(out parsed))
return parsed;
return System.Convert.ToInt32(parsed) * 100;
}
}