无法将“System.String”类型的对象强制转换为“..Controls.SurfaceListBoxItem”异常

时间:2010-07-22 10:55:39

标签: c# wpf pixelsense

我要做的就是为列表框中的每个值比较一个已选择的值,然后将匹配索引设置为选中。 出于某种原因,提出了标题中的例外情况。我不明白为什么。 代码:

            foreach(SurfaceListBoxItem n in BackgroundsList.Items)
        {
            if (n.ToString() == current) BackgroundsList.SelectedItem = n;
        }

谢谢!

2 个答案:

答案 0 :(得分:2)

在WPF中,List.Items不一定包含ListBoxItem的集合,而是只包含数据值,并且派生数据的Item Container,要设置值,您必须简单地将当前设置为所选项目。

无需迭代,您可以简单地执行以下操作,

BackgroundsList.SelectedItem = current;

答案 1 :(得分:2)

C#foreach语句根据Items返回到指定SurfaceListBoxItem类型的元素类型为您执行隐式转换。在运行时,返回的string无法转换为SurfaceListBoxItem。您可以使用var代替SurfaceListBoxItem

来解决此问题
foreach(var n in BackgroundsList.Items)
{
    if (n.ToString() == current) BackgroundsList.SelectedItem = n;
}

或者,当然,您可以使用LINQ:

BackgroundsList.SelectedItem = (
    from n in BackgroundList.Items
    where n.ToString() == current
    select n).FirstOrDefault();