ComboBox SelectionChanged 事件处理程序中的 InvalidCastException

InvalidCastException in ComboBox SelectionChanged event handler

此代码运行良好:

 private void Combobox1_Loaded(object sender, RoutedEventArgs e)
 {
     var combo = (ComboBox)sender;
     var pointGroupList = (List<PointGroup>)combo.ItemsSource;
     combo.ItemsSource = pointGroupList.Select(group => group.Name);
 }

但是这个根本不起作用:

private void Combobox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var combo = (ComboBox)sender;
    var pointGroupList = (List<PointGroup>)combo.ItemsSource;
    textBlock1.Text = "num of points:" + pointGroupList.Find(group => group.Name == (string)combo.SelectedItem).PointsCount.ToString();
}

这是我输出的消息 window:

System.InvalidCastException: Unable to cast object of type 'WhereSelectListIterator2[Autodesk.Civil.DatabaseServices.PointGroup,System.String]' to type 'System.Collections.Generic.List1[Autodesk.Civil.DatabaseServices.PointGroup]'. at _01_COGO_Points.ModalDialog_1.Combobox1_SelectionChanged(Object sender, SelectionChangedEventArgs e) in D:[=12=] Materials\c3d\c#\examples\ACAD COGO Points\Window.xaml.cs:line 49

任何帮助将不胜感激。

你在 Loaded 活动中所做的事情很奇怪。我不建议这样做,因为它会破坏你的绑定。如果您这样做的原因是 Name 属性 显示在您的 ComboBox 中,您应该使用 DataTemplate。像这样:

<Window.Resources>
    <DataTemplate x:Key="pntGroupTemplate" DataType="{x:Type ac:PointGroup}">
        <TextBlock Text="{Binding Name}"/>
    </DataTemplate>
</Window.Resources>

您当然需要向您的 Window 添加一个命名空间。像这样:

xmlns:ac="clr-namespace:Autodesk.Civil.DatabaseServices;assembly=AeccDbMgd"

我没有 Civil,所以不确定这是否完全正确,但应该很接近。如果这个路径不太正确,Intellisense 应该能够帮助您找到正确的路径。

在您的组合框中,

<ComboBox ItemTemplate="{StaticResource pntGroupTemplate}" ...  />

我最好的建议是完全删除 Combobox1_Loaded 事件处理程序中的所有代码,并在 xaml 中创建一个 DataTemplate 来显示 Name 属性 使用上面的代码片段。最后,将您的 lambda 表达式更改为:

group => group.Name == (string)combo.SelectedItem

对此:

group => group.Name == (combo.SelectedItem as PointGroup)?.Name

您遇到的异常是由第二行引起的。当您在 Loaded 事件中调用 Select 方法时,它会 returns IEnumerable<string>,因此当您将 ItemsSource 转换为 List<PointGroup> 时,一切都会发生变化有很多不同的方式:-).

您正在做的事情的另一个问题是,现在 SelectedItemstring,并且没有 Name 属性。

希望对您有所帮助