【问题标题】:String Converter is Unable to cast object of type 'MS.Internal.NamedObject' to type 'System.String'字符串转换器无法将“MS.Internal.NamedObject”类型的对象转换为“System.String”类型
【发布时间】:2017-12-30 10:38:57
【问题描述】:

我创建了一个转换器,它将单个字符串与逗号分隔的字符串进行比较,如果找到单个匹配项则返回 yes。我遇到了一个例外

“System.InvalidCastException:无法将“MS.Internal.NamedObject”类型的对象转换为“System.String”类型。”

    public class IsEqual : IMultiValueConverter
{
    public object Convert(object[] values, Type targetTypes, object parameter, CultureInfo culture)
    {
        string value1 = (string)values[1];
        string[] splitVal = value1.Split(",".ToArray(), System.StringSplitOptions.RemoveEmptyEntries);

            foreach (var item in splitVal)
            {
                try
                {
                    string comparison = (string)values[0];

                    char[] delimiters = new char[1];
                    delimiters[0] = ',';

                    string[] split = ((string)values[1]).Split(delimiters);

                    foreach (string str in split)
                    {
                        if (comparison == str)
                        {
                            return String.Format("yes");
                        }
                    }
                }
                catch (Exception ex)
                {
                    return String.Format("Error: " + ex.ToString());
                }
                return String.Format("no");
            }
            return null;
        }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return null;
    }

}

在标记内,它用作 DataGridColumn 中的 DataTemplate 以指示找到匹配项:

<DataTemplate x:Key="Match">
<StackPanel>
    <Ellipse x:Name="Matches_Icon" Background="Green" HorizontalAlignment="Center" VerticalAlignment="Center" />
    <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Visibility="Collapsed" Orientation="Vertical">
        <TextBox x:Name="value0" Text="{Binding ElementName=SingleItem,Path=Text,Mode=OneWay,TargetNullValue=0}" />
        <TextBlock x:Name="value1" Text="{Binding CommaDeliminatedItem,Mode=OneWay,TargetNullValue=0}" />
        <TextBox x:Name="Result" >
            <TextBox.Text>
                <MultiBinding Converter="{StaticResource IsEqual}">
                    <Binding ElementName="value0" Path="Text" Mode="OneWay" TargetNullValue="0" />
                    <Binding ElementName="value1" Path="Text" Mode="OneWay" TargetNullValue="0" />
                </MultiBinding>
            </TextBox.Text>
        </TextBox>
    </StackPanel>
</StackPanel>
<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding ElementName=Result,Path=Text}" Value="yes">
        <Setter TargetName="SelectedArt_Icon" Property="Visibility" Value="Visible" />
    </DataTrigger>
    <DataTrigger Binding="{Binding ElementName=Result,Path=Text}" Value="no">
        <Setter TargetName="SelectedArt_Icon" Property="Visibility" Value="Collapsed" />
    </DataTrigger>
</DataTemplate.Triggers>

进一步深入研究,XAML 绑定中的“value1”是 DataGrid 中的数据,value0 是从数据网格外部提供的。找到匹配项时,返回“是”(不知道为什么我们不使用布尔值..),这会触发椭圆的可见性属性。

不应该传入一个空值,所以我不知道这个错误是从哪里来的。

从日志中编辑: System.InvalidCastException:无法将“MS.Internal.NamedObject”类型的对象转换为“System.String”类型。 在 CustomMashupUI.IsEqual.Convert(Object[] values, Type targetTypes, Object parameter, CultureInfo 文化) 在 System.Windows.Data.MultiBindingExpression.TransferValue() 在 System.Windows.Data.MultiBindingExpression.Transfer() 在 System.Windows.Data.MultiBindingExpression.UpdateTarget(布尔 includeInnerBindings) 在 System.Windows.Data.MultiBindingExpression.AttachToContext(布尔最后机会) 在 System.Windows.Data.MultiBindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(布尔 lastChance) 在 MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance) 在 MS.Internal.Data.DataBindEngine.Run(对象 arg) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象 args,Int32 numArgs) 在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

【问题讨论】:

标签: c# exception


【解决方案1】:

问题在于 values 是一个对象数组。如果要将成员转换为字符串类型,请使用:

string value1 = values[1].ToString();

string value1 = Convert.ToString(values[1]);

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2017-11-24
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多