指定的转换无效 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();
        }      
    }

我不确定为什么我无法将 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 在从源到目标时自动处理绑定中类型 stringdouble 之间的转换,反之亦然,但如果您指定自己的转换器,则必须确保提供完全正确的 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;
    }      
}