【问题标题】:InvalidCastException in converter转换器中的 InvalidCastException
【发布时间】:2010-02-11 01:20:08
【问题描述】:

这是我实现 IValueConverter 的类:

[ValueConversion(typeof(int), typeof(Priority))]
public class PriorityConverter : IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (Priority) (int) value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

看来这行代码抛出了InvalidCastException:

return (Priority) (int) value;

(优先级是枚举)我在方法的开头放置了一个断点,“value”的值是 int:4,所以我不知道为什么会抛出这个异常。 以下是资源(其中 app_data="clr-namespace:AssignmentOrganizer.App_Data"):

<app_data:PriorityConverter x:Key="PriorityConverter" />
<app_data:KindConverter x:Key="KindConverter" />

这里是实现:

<gridview:GridViewDataColumn Header="Priority" Width="100" DataMemberBinding="{Binding Priority, Converter={StaticResource PriorityConverter}}" />
<gridview:GridViewDataColumn Header="Kind" Width="100" DataMemberBinding="{Binding Kind, Converter={StaticResource KindConverter}}" />

【问题讨论】:

  • 我们需要更多关于这个优先级的信息...
  • 检查该值是否绝对是一个 int -- 不是 int? 或 long 或 short 等。你能做一个 Debug.WriteLine(value.GetType().Name) 并告诉我们它打印的内容吗?
  • RCIX,优先级是一个具有小值(0-4)的枚举。 Itowlson,在调试器中,当我悬停对象值时,它会显示“value = 4”。
  • Mohit:悬停在调试器中并不总是提供完整的信息。如果打印 value.GetType().Name 会发生什么? (您可以在调试器中停止时在立即窗口中执行此操作。)
  • 绑定源类的 Priority 属性的定义是什么?

标签: c# converter ivalueconverter .net


【解决方案1】:

正如问题的 cmets 中所讨论的,发生这种情况是因为实际传递给您的值转换器的是字节而不是 Int32。拆箱强制转换必须始终是准确的类型;要确定确切的类型,值得使用 Debug.WriteLine 或即时窗口检查 value.GetType().Name。

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多