【问题标题】:WPF VB.NET IMultiValueConverter and "Conversion from type 'NamedObject' to type Double' is not valid"WPF VB.NET IMultiValueConverter 和“从类型 'NamedObject' 到类型 Double' 的转换无效”
【发布时间】:2012-09-03 19:20:20
【问题描述】:

您好,我的 IMultiValueConverter 中有以下功能

Public Function Convert(ByVal values() As Object, _
                     ByVal targetType As System.Type, _
                     ByVal parameter As Object, _
                     ByVal culture As System.Globalization.CultureInfo) As Object Implements IMultiValueConverter.Convert
    If Not IsDBNull(values(0).ToString) And AndAlso Not IsDBNull(values(1).ToString) Then 
        If CDbl((values(1))) > 0 Then

            Select Case CInt(Fix(values(0)))
                Case 1
                    Return New LinearGradientBrush(Color.FromArgb(My.Settings.r1rowcolor.A, My.Settings.r1rowcolor.R, My.Settings.r1rowcolor.G, My.Settings.r1rowcolor.B), Color.FromArgb(My.Settings.r1rowendcolor.A, My.Settings.r1rowendcolor.R, My.Settings.r1rowendcolor.G, My.Settings.r1rowendcolor.B), My.Settings.r1angle)
                Case 2
                    Return New LinearGradientBrush(Color.FromArgb(My.Settings.r2rowcolor.A, My.Settings.r2rowcolor.R, My.Settings.r2rowcolor.G, My.Settings.r2rowcolor.B), Color.FromArgb(My.Settings.r2rowendcolor.A, My.Settings.r2rowendcolor.R, My.Settings.r2rowendcolor.G, My.Settings.r2rowendcolor.B), My.Settings.r2angle)
                Case 3
                    Return New LinearGradientBrush(Color.FromArgb(My.Settings.r3rowcolor.A, My.Settings.r3rowcolor.R, My.Settings.r3rowcolor.G, My.Settings.r3rowcolor.B), Color.FromArgb(My.Settings.r3rowendcolor.A, My.Settings.r3rowendcolor.R, My.Settings.r3rowendcolor.G, My.Settings.r3rowendcolor.B), My.Settings.r3angle)
                Case Is > 3
                    Return New LinearGradientBrush(Color.FromArgb(My.Settings.rm3rowcolor.A, My.Settings.rm3rowcolor.R, My.Settings.rm3rowcolor.G, My.Settings.rm3rowcolor.B), Color.FromArgb(My.Settings.rm3rowendcolor.A, My.Settings.rm3rowendcolor.R, My.Settings.rm3rowendcolor.G, My.Settings.rm3rowendcolor.B), My.Settings.r4angle)
            End Select

        ElseIf CDbl((values(1))) < 0 Then
            Return New LinearGradientBrush(Color.FromArgb(My.Settings.minpricesprice.A, My.Settings.minpricesprice.R, My.Settings.minpricesprice.G, My.Settings.minpricesprice.B), Color.FromArgb(My.Settings.minpricesprice.A, My.Settings.minpricesprice.R, My.Settings.minpricesprice.G, My.Settings.rm3rowendcolor.B), My.Settings.minpricespriceangle)
        End If
    End If
End Function

在以下行中,我得到一个异常“从类型 'NamedObject' 到类型 Double' 的转换无效”

If CDbl((values(1))) > 0 Then

所以我想知道是什么导致了这个异常,它会不会检查 DBNULLS 失败? 请注意,转换器在没有多重绑定的情况下工作

或者是我传递了 2 个值,一个是整数,一个是双精度值?

【问题讨论】:

    标签: wpf vb.net multibinding


    【解决方案1】:

    CollectionView 中的NewItemPlaceholderNamedObject,所以可能ItemPlaceholder 最终会被传递到您的转换器中。

    【讨论】:

    • 听起来很合理,它给出了以下参数类型“数字”是“MS.Internal.NamedObject”,它不是数字。
    • 但如果我添加 MsgBox(values(0).ToString) MsgBox(values(1).ToString) 我可以看到它们是正确的值
    • @user1570048: ToString 根本没有说明底层类型,该对象很可能包含一些临时数据并通过ToString 显示。
    • 对如何解决这个问题有什么建议吗?
    • @user1570048:好吧,要么不使用值转换器,而是在数据对象上公开您想要的值,或者通过类型检查过滤掉不需要的项目(不是很干净)。 (this answer 的后半部分是公开转换值的示例)
    【解决方案2】:

    试试这个:

    Public Function Convert(ByVal values() As Object, _
                     ByVal targetType As System.Type, _
                     ByVal parameter As Object, _
                     ByVal culture As System.Globalization.CultureInfo) As Object Implements IMultiValueConverter.Convert
    If values IsNot Nothing AndAlso Not values.Any(Function(x) x Is DependencyProperty.UnsetValue) AndAlso Not IsDBNull(values(0).ToString)  AndAlso
    Not IsDBNull(values(1).ToString) Then 
        If CDbl((values(1))) > 0 Then
    
            Select Case CInt(Fix(values(0)))
                Case 1
                    Return New LinearGradientBrush(Color.FromArgb(My.Settings.r1rowcolor.A, My.Settings.r1rowcolor.R, My.Settings.r1rowcolor.G, My.Settings.r1rowcolor.B), Color.FromArgb(My.Settings.r1rowendcolor.A, My.Settings.r1rowendcolor.R, My.Settings.r1rowendcolor.G, My.Settings.r1rowendcolor.B), My.Settings.r1angle)
                Case 2
                    Return New LinearGradientBrush(Color.FromArgb(My.Settings.r2rowcolor.A, My.Settings.r2rowcolor.R, My.Settings.r2rowcolor.G, My.Settings.r2rowcolor.B), Color.FromArgb(My.Settings.r2rowendcolor.A, My.Settings.r2rowendcolor.R, My.Settings.r2rowendcolor.G, My.Settings.r2rowendcolor.B), My.Settings.r2angle)
                Case 3
                    Return New LinearGradientBrush(Color.FromArgb(My.Settings.r3rowcolor.A, My.Settings.r3rowcolor.R, My.Settings.r3rowcolor.G, My.Settings.r3rowcolor.B), Color.FromArgb(My.Settings.r3rowendcolor.A, My.Settings.r3rowendcolor.R, My.Settings.r3rowendcolor.G, My.Settings.r3rowendcolor.B), My.Settings.r3angle)
                Case Is > 3
                    Return New LinearGradientBrush(Color.FromArgb(My.Settings.rm3rowcolor.A, My.Settings.rm3rowcolor.R, My.Settings.rm3rowcolor.G, My.Settings.rm3rowcolor.B), Color.FromArgb(My.Settings.rm3rowendcolor.A, My.Settings.rm3rowendcolor.R, My.Settings.rm3rowendcolor.G, My.Settings.rm3rowendcolor.B), My.Settings.r4angle)
            End Select
    
        ElseIf CDbl((values(1))) < 0 Then
            Return New LinearGradientBrush(Color.FromArgb(My.Settings.minpricesprice.A, My.Settings.minpricesprice.R, My.Settings.minpricesprice.G, My.Settings.minpricesprice.B), Color.FromArgb(My.Settings.minpricesprice.A, My.Settings.minpricesprice.R, My.Settings.minpricesprice.G, My.Settings.rm3rowendcolor.B), My.Settings.minpricespriceangle)
        End If
    End If
    

    结束函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2015-02-09
      相关资源
      最近更新 更多