指定的强制转换不是有效的WPF、IValueCOnverter、C#-要加倍的对象



我正试图在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会自动处理绑定中stringdouble等类型之间的转换,反之亦然,但如果您指定了自己的转换器,则必须确保提供正确的返回类型。

简单的修复方法是:

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;
}      
}

最新更新