指定的转换无效 WPF、IValueCOnverter、C# - 要加倍的对象
Specified cast is not valid WPF, IValueCOnverter, C# - object to double
我正在尝试在 WPF、C# 中设置 IValueConverter。这个转换器的目的是将传入的值除以 100,这样我们就可以得到一个双倍值。在启动之前我没有在 then 代码中看到任何错误,但是当我去测试它时,我得到以下错误:
System.InvalidCastException: 'Specified cast is not valid.'
这是转换器的代码:
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 = {名称 = "String" 全名 = "System.String"}
我不确定为什么我无法将 value 转换为 double 来执行所需的数学运算
这就是我所说的:
<DataGridTextColumn Header="Price" Width="2*" Binding="{Binding intPrice, Converter={StaticResource DecimalPlace}, StringFormat='{}{0:C0}'}"/>
请包括 Xaml 您使用此转换器的地方。我的猜测是您最初在文本框中使用了空字符串。尝试将回退值应用到 0。您应该检查转换器代码,您的输入值实际上可以解析为数字,例如使用 double.TryParse !
<TextBox Text=“{Binding MyNumberInViewModel, Mode=Twoway, Fallbackvalue=‘0’}” />
我的猜测是 targetType 是 string
并且您的代码中实际上并未发生异常(您忽略了 post 堆栈跟踪)。它被绑定到需要字符串的 DataGridTextColumn
。所以你的转换器 必须 return 一个字符串。通常 WPF 在从源到目标时自动处理绑定中类型 string
和 double
之间的转换,反之亦然,但如果您指定自己的转换器,则必须确保提供完全正确的 return类型。
简单的修复是:
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
另一种变体,对缺少验证更有弹性。
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;
}
}
我正在尝试在 WPF、C# 中设置 IValueConverter。这个转换器的目的是将传入的值除以 100,这样我们就可以得到一个双倍值。在启动之前我没有在 then 代码中看到任何错误,但是当我去测试它时,我得到以下错误:
System.InvalidCastException: 'Specified cast is not valid.'
这是转换器的代码:
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 = {名称 = "String" 全名 = "System.String"}
我不确定为什么我无法将 value 转换为 double 来执行所需的数学运算
这就是我所说的:
<DataGridTextColumn Header="Price" Width="2*" Binding="{Binding intPrice, Converter={StaticResource DecimalPlace}, StringFormat='{}{0:C0}'}"/>
请包括 Xaml 您使用此转换器的地方。我的猜测是您最初在文本框中使用了空字符串。尝试将回退值应用到 0。您应该检查转换器代码,您的输入值实际上可以解析为数字,例如使用 double.TryParse !
<TextBox Text=“{Binding MyNumberInViewModel, Mode=Twoway, Fallbackvalue=‘0’}” />
我的猜测是 targetType 是 string
并且您的代码中实际上并未发生异常(您忽略了 post 堆栈跟踪)。它被绑定到需要字符串的 DataGridTextColumn
。所以你的转换器 必须 return 一个字符串。通常 WPF 在从源到目标时自动处理绑定中类型 string
和 double
之间的转换,反之亦然,但如果您指定自己的转换器,则必须确保提供完全正确的 return类型。
简单的修复是:
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
另一种变体,对缺少验证更有弹性。
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;
}
}