指定的强制转换无效WPF,IValueCOnverter,C#-要加倍的对象

时间:2018-07-11 19:34:00

标签: c# wpf ivalueconverter

我正在尝试在WPF,C#中设置IValueConverter。该转换器的目的是获取传入的值并除以100,这样我们就可以获得两倍的值。启动前在代码中没有看到任何错误,但是当我进行测试时,出现以下错误:

  

System.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 = {名称=“字符串”全名=“ System.String”}

我不确定为什么我不能将值转换为用于执行所需数学运算的双精度数

这就是我所说的:

<DataGridTextColumn Header="Price" Width="2*" Binding="{Binding intPrice, Converter={StaticResource DecimalPlace}, StringFormat='{}{0:C0}'}"/>

3 个答案:

答案 0 :(得分:0)

请在使用此转换器的地方提供Xaml。我的猜测是,您最初在文本框中使用了空字符串。尝试将后备值应用为0。您应该在转换器代码中检查输入的值实际上可以解析为数字,例如使用double.TryParse!

<TextBox Text=“{Binding MyNumberInViewModel, Mode=Twoway, Fallbackvalue=‘0’}” />

答案 1 :(得分:0)

我的猜测是targetType为string,并且代码中实际上没有发生异常(您忽略了发布堆栈跟踪)。它绑定到需要一个字符串的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

答案 2 :(得分: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;
    }      
}