【问题标题】:Specified cast is not valid WPF, IValueCOnverter, C# - object to double指定的强制转换无效 WPF、IValueCONverter、C# - 对象加倍
【发布时间】:2018-07-11 19:33:59
【问题描述】:

我正在尝试在 WPF、C# 中设置 IValueConverter。这个转换器的目的是把传入的值除以 100,这样我们就可以得到一个 double。在启动之前我没有看到代码中有任何错误,但是当我去测试它时,我收到以下错误:

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 = {Name = "String" FullName = "System.String"}

我不确定为什么我无法将 value 转换为 double 来进行所需的数学运算

这就是我所说的:

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

【问题讨论】:

  • 它是否试图将 .05 之类的转换为整数?
  • Tbh,我什至还没到那部分。从理论上讲,这就是代码会做的事情并且会严重破坏。我的问题是将 value(5) 转换为 double 然后除以 100 得到 0.05
  • 您的函数返回object。您需要返回 DoubleInt32 才能使转换在您的 return 语句中有效。
  • 哪一行抛出异常?什么是目标类型?绑定是什么样子的?
  • 啊,就是这样 return double

标签: c# wpf ivalueconverter


【解决方案1】:

我的猜测是 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】:

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

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

    【讨论】:

      【解决方案3】:

      另一种变体,对缺少验证更有弹性。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-09
        • 1970-01-01
        • 2011-01-28
        • 2015-01-06
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 2018-05-27
        相关资源
        最近更新 更多