在WPF中使用SelectedItem从包含TextBlocks的ListBox中获取值

本文关键字:TextBlocks ListBox 获取 包含 WPF SelectedItem | 更新日期: 2023-09-27 18:04:47

我有一个列表框,它的数据来自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 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'

谁能告诉我我做错了什么在试图检索所选的项目,或者如果我绑定的数据错误,这就是为什么我不能得到所选的项目。

编辑:

在应用了这个解决方案之后,我必须对我的列表框进行另一次编辑,使其再次可搜索。

<<p> 之前代码/strong>
IsTextSearchEnabled="True" TextSearch.TextPath="Name"

修复代码

IsTextSearchEnabled="True" TextSearch.TextPath="{Binding Name}"

在WPF中使用SelectedItem从包含TextBlocks的ListBox中获取值

您不必要地用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;