【问题标题】:Get items values of ListBox with SelectedIndex使用 SelectedIndex 获取 ListBox 的项目值
【发布时间】:2013-05-10 21:44:24
【问题描述】:

我有例如 ListBox 和两个 TextBlocks 这样的:

<ListBox Name="listboxNews"
         SelectionChanged="listboxNews_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Width="400"
                        Height="70">
                <TextBlock Text="{Binding Title}" name="title" />
                <TextBlock Text="{Binding Description}" name="desc" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

如您所见,我有listboxNews_SelectionChanged 方法,在该方法中我需要选择第一个 TextBlock 的文本(如果按名称可能,那么它将独立于文本块的顺序),但是这个,我选择。例如,如果第一个项目有标题“项目 1”和第二个“项目 2”,我点击第二个,我需要得到“项目 2”。我正在尝试使用 listboxNews.Items,但我想这是不正确的。感谢您的帮助。

【问题讨论】:

    标签: c# windows-phone-7 listbox listboxitem


    【解决方案1】:

    SelectedItem 属性将保存当前选定的对象。您可以直接转换它并获取 Title 属性。

    试试这个代码:

    private void listboxNews_SelectionChanged(object sender, SelectionChangedEventArgs e) {
      var current = listboxNews.SelectedItem as MyObjectType;
      MessageBox.Show(current.Title);
    }
    

    将MyObjectType 更改为您的对象类型。

    【讨论】:

    • 我这样做了,但我仍然得到 NullReferenceException。我的班级News 有变量public string Title { get; set; } 但是当我做var current = listboxNews.SelectedItem as News; 时,current.Title 似乎仍然为空......
    • 在我的connectNews_DownloadStringCompleted() 中是:News = XElement.Parse(e.Result); listboxNews.ItemsSource = from news in News.Descendants("newsItem") select new News { Title = news.Element("title").Value, Description = news.Element("description").Value, };
    • 哪一个是空的? listboxNews.SelectedItem 还是仅当您将其转换为新闻时?在 SelectionChanged 事件中打断点,在调试器中检查 listBoxNew.SelectedItem 的值类型。
    【解决方案2】:

    这是一个有效的 Windows Phone 8 解决方案的复制和粘贴。

    这也在 WPF 中成功测试。

     private void ListBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
                {
                    foreach (UIElement item in (sender as ListBox).Items)
                    {
                        if ((sender as ListBox).SelectedItem == item)
                        {
                            foreach (UIElement InnerItem in (item as StackPanel).Children)
                            {
                                if ((InnerItem is TextBlock) && (InnerItem as TextBlock).Name.Equals("title"))
                                {
                                    MessageBox.Show((InnerItem as TextBlock).Text);
                                }
                            }
                        }
                    }
                }

    【讨论】:

    • 不...我需要做的是这个 - 我有一个充满新闻的列表框(每个列表框行/项目的每个新闻),点击某个项目后,我想打开详细信息此新闻的页面...为此,我需要将标题作为参数传递给详细信息页面,因此我需要所选项目的标题值。
    • 然后你可以使用任何你想要的名字。
    • &lt;TextBlock Text="{Binding Title}" name="title" /&gt; 我需要 Text 当前选定列表框项的值。
    • @PavelŠtěrba 不要忘记在第一个 foreach 中添加 if 子句,否则它将打印所有标题,而不仅仅是选定的标题
    • 现在它在 foreach 中抛出 InvalidCastException (UIElement item in (sender as ListBox).Items)
    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多