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

时间:2014-05-24 01:21:27

标签: c# wpf xaml listbox textblock

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

任何人都可以告诉我在尝试检索所选项目时我做错了什么,或者我是否将数据绑定错误,这就是我无法获取所选项目的原因。

修改 应用解决方案后,我必须对列表框进行另一次编辑,以便再次搜索。

以前的代码

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

解决问题的代码

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

1 个答案:

答案 0 :(得分: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;

然后当然绑定到(字符串)项本身:

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

现在ListBox.SelectedItem应该是一个字符串,您可以通过取消装箱获取一行:

string selectedValue = (string)this.lbSystems.SelectedItem;