InvalidCastException в обработчике событий ComboBox SelectionChanged - PullRequest
0 голосов
/ 18 декабря 2018

Этот код работает хорошо:

 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();
}

Вот сообщение в моем окне вывода:

System.InvalidCastException: Невозможно привести объект типа 'WhereSelectListIterator2 [Autodesk.Civil.DatabaseServices.PointGroup, System.String]' к типу 'System.Collections.Generic.List1 [Autodesk.Civil.DatabaseServices.PointGroup]'.в _01_COGO_Points.ModalDialog_1.Combobox1_SelectionChanged (Отправитель объекта, SelectionChangedEventArgs e) в D: \ 00 Материалы \ c3d \ c # \ examples \ ACAD \ 01 COGO Points \ Window.xaml.cs: линия 49

ЛюбойПомощь будет оценена.

1 Ответ

0 голосов
/ 18 декабря 2018

То, что вы делаете на вашем Loaded мероприятии, довольно странно.Я не рекомендовал бы делать это, поскольку это разрушит ваши привязки.Если причина, по которой вы это делаете, заключается в том, что свойство Name отображается в вашем ComboBox, вам лучше использовать DataTemplate.Примерно так:

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

и вам, конечно же, нужно добавить пространство имен в ваше окно.Примерно так:

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

У меня нет Civil, поэтому не уверен, что это правильно, но это должно быть близко.Intellisense должен быть в состоянии помочь вам с правильным путем, если этот путь не совсем правильный.

и в вашем поле со списком,

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

Мой лучший совет - просто полностью избавиться от всехкод в обработчике событий Combobox1_Loaded и создайте DataTemplate в xaml для отображения свойства Name, используя фрагмент кода выше.И наконец, измените свое лямбда-выражение с этого:

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

на следующее:

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

Исключение, которое вы получаете, связано со второй строкой.Когда вы вызываете метод Select в событии Loaded, он возвращает IEnumerable<string>, поэтому, когда вы преобразуете ItemsSource в List<PointGroup>, вот где все идет в разные стороны: -).

Другая проблема с тем, что вы делаете, заключается в том, что сейчас SelectedItem является string и не имеет свойства Name.

Надеюсь, что поможет

...