获取在C#的ListBox中选择的文本值

时间:2019-02-11 17:33:34

标签: c# listbox

我有一个列表框

  <Label Content="Report" HorizontalAlignment="Left" Height="47" Margin="36,75,0,0" VerticalAlignment="Top" Width="63"/>
    <ListBox x:Name="ListBox1" HorizontalAlignment="Left" Height="121" Margin="84,75,0,0" VerticalAlignment="Top" Width="102" SelectionChanged="ListBox_SelectionChanged" SelectedIndex="-1">
        <ListBox Height="100" Width="100" SelectionChanged="ListBox_SelectionChanged_1">
            <ListBoxItem x:Name="ListBoxFAT" Content="FAT"/>
            <ListBoxItem x:Name="ListBoxNUMI" Content="NUMI"/>
            <ListBoxItem x:Name="ListBoxSSID" Content="SSID"/>
            <ListBoxItem x:Name="ListBoxFact" Content="FACT"/>
        </ListBox>
    </ListBox>

这是通过从工具栏拖动列表框图标创建的。我添加了项目及其值。
现在,我试图获取所选项目的文本值。

 private void ListBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    {
        string text = (string)ListBox1.SelectedValue;
        MessageBox.Show(text);

我也尝试了SelectedItem

string text = (string)ListBox1.SelectedItem;

但是消息框始终为空白。
这应该很简单,但是我已经研究了好几个小时,并且尝试了所有关于stackoverflow的建议或答案。大多数建议甚至都没有编译。例如:

  string selected = listBox1.GetItemText(listBox1.SelectedValue);

将无法编译。找不到GetItemText。我正在使用Visual Studio17。“'ListBox不包含'GetItemText'的定义...”

有什么想法吗?请指教。谢谢。

谢谢你的评论,查尔斯。我做到了 进一步玩,现在我得到

System.InvalidCastException: 'Unable to cast object of type 'System.Windows.Controls.ListBoxItem' to type 'System.String'.'

string text = (string)ListBox1.SelectedItem;

2 个答案:

答案 0 :(得分:1)

在标记中,SelectedIndex设置为-1,这意味着没有选择。在这种情况下,SelectedValueSelectedItem都返回null。您可以通过将SelectedIndex设置为0到3之间的值来解决此问题,也可以通过准备代码来处理SelectedValueSelectedItem中的空值来解决此问题,例如

string text = (ListBox1.SelectedItem as ListBoxItem)?.Content?.ToString();

这不会引发错误,因此用户可以随后选择一个项目。选择后,文本应按预期显示。

答案 1 :(得分:1)

如Charles May所指出的那样,您的XAML显示您的ListBox位于另一个ListBox中,这就是为什么您会引发错误的原因。

被称为“ ListBox_SelectionChanged_1”的事件绑定到未命名的ListBox1内的ListBox对象。

我相信您正在寻找的行为将是这样固定的:

XAML:

<Label Content="Report" HorizontalAlignment="Left" Height="47" Margin="36,75,0,0" VerticalAlignment="Top" Width="63"/>
    <ListBox x:Name="ListBox1" HorizontalAlignment="Left" Height="121" Margin="84,75,0,0" VerticalAlignment="Top" Width="102" SelectionChanged="ListBox_SelectionChanged" SelectedIndex="-1">            
        <ListBoxItem x:Name="ListBoxFAT" Content="FAT"/>
        <ListBoxItem x:Name="ListBoxNUMI" Content="NUMI"/>
        <ListBoxItem x:Name="ListBoxSSID" Content="SSID"/>
        <ListBoxItem x:Name="ListBoxFact" Content="FACT"/>            
    </ListBox>

后面的代码:

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   string text = ((sender as ListBox)?.SelectedItem as ListBoxItem)?.Content.ToString();
   MessageBox.Show(text);
}

或者至少是接近该解决方案的地方。