【发布时间】: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)
【问题讨论】:
-
您应该指定错误所在的行。我想知道它是否像
values[1]实际上不是一个字符串一样简单,所以你在第一行的转换失败了。