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>
时,一切都会发生变化有很多不同的方式:-).
您正在做的事情的另一个问题是,现在 SelectedItem
是 string
,并且没有 Name
属性。
希望对您有所帮助
此代码运行良好:
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>
时,一切都会发生变化有很多不同的方式:-).
您正在做的事情的另一个问题是,现在 SelectedItem
是 string
,并且没有 Name
属性。
希望对您有所帮助