Получить значение из ListBox, содержащего TextBlocks, используя SelectedItem в WPF

1

У меня есть список, данные которого получены из результатов запроса linq. В списке отображается все правильно, но я не могу понять, как извлечь выбранный элемент из списка. Я пробовал несколько вещей, и я либо получаю исключения, заявляя, что не может использовать анонимный тип, либо значения не сохраняют свои значения до следующей строки.

Источник данных

    private void FavoritesPopulate()
    {
        dynamic qryFavorties = (from db in AppGlobal.GlobalDataset.Tables[ListFavorites.ListStringName].AsEnumerable()
                                select new { Name = db.Field<string>("SystemName") }).OrderBy(db => db.Name);
        this.lbSystems.DataContext = qryFavorties;
    }

Listbox

<ListBox x:Name="lbSystems" VerticalAlignment="Stretch" DockPanel.Dock="Left" Width="Auto" IsTextSearchEnabled="True" TextSearch.TextPath="Name"
                     Background="Transparent" Foreground="{DynamicResource DynamicFrmFG}" FontFamily="Consolas" 
                     ItemsSource="{Binding}" ItemTemplate="{StaticResource mySystemTemplate}" SelectionChanged="lbSystems_SelectionChanged" >
                <ListBox.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{DynamicResource DynamicCtrlHighlight}"/>
                    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{DynamicResource DynamicCtrlHighlight}"/>
                </ListBox.Resources>
            </ListBox>

Ресурс

    <Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVis" />

    <DataTemplate x:Key="mySystemTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Path=Name}" Foreground="{DynamicResource DynamicFrmFG}" FontSize="14" FontFamily="Consolas" />
        </StackPanel>
    </DataTemplate>
    </Window.Resources>

Код Я попытался получить выбранное имя системы

ListBoxItem myListBoxItem = (ListBoxItem)(this.lbSystems.ItemContainerGenerator.ContainerFromItem(this.lbSystems.Items.CurrentItem));
            TextBlock tb = (TextBlock)this.lbSystems.SelectedItem;
            ListBoxItem lbi = (this.lbSystems.SelectedItem as ListBoxItem);
            ListItemCollection lbi = this.lbSystems.SelectedItem as ListItemCollection;


            var test = lbi.Content.ToString();

Большинство всего, что я стараюсь, когда смотрю на IDE, на экране Watch имеют переменные, которые говорят, что они не существуют в текущем контексте. Затем бросок TextBlock вызывает ошибку:

Unable to cast object of type '<>f__AnonymousType0'1[System.String]' to type 'System.Windows.COntrols.TextBlock'

Может ли кто-нибудь показать мне, что я делаю неправильно, пытаясь получить выбранный элемент, или если я привязал данные к ошибкам и почему я не могу получить выбранный элемент.

Изменить: после применения решения мне пришлось сделать еще одно редактирование в моем списке, чтобы он снова был доступен для поиска.

Предыдущий код

IsTextSearchEnabled="True" TextSearch.TextPath="Name"

Код для его исправления

IsTextSearchEnabled="True" TextSearch.TextPath="{Binding Name}"
Теги:
xaml
wpf
listbox
textblock

1 ответ

2
Лучший ответ

Вы бесполезно создали анонимный тип, в строке select new { Name = db.Field<string>("SystemName") }. Просто выберите обычную старую строку, используя вместо этого select db.Field<string>:

IEnumerable<string> qryFavorties = (from db in AppGlobal.GlobalDataset.Tables[ListFavorites.ListStringName].AsEnumerable()
    select db.Field<string>("SystemName")).OrderBy(name => name);
this.lbSystems.DataContext = qryFavorties;

И тогда, конечно, привязывайтесь к самому элементу (string):

<TextBlock Text="{Binding}" ... />

Теперь ListBox.SelectedItem должен быть строкой, которую вы можете получить в одной строке путем распаковки:

string selectedValue = (string)this.lbSystems.SelectedItem;
  • 0
    @McGarnage Спасибо. Я думаю, что мне, возможно, придется больше узнать о linq и привязке, чтобы я больше не повторял эту ошибку. Я обычно использую оригинальный метод linq, который я выбираю, поэтому я могу легко извлечь несколько полей выбора из linq, чтобы назначить их переменные. Не совсем понял название => название вещи пока полностью.
  • 0
    @codeSwearing the name => name это просто проходной селектор, поэтому у вас есть IEnumerable с элементами строкового типа, и вы упорядочиваете сам элемент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню