我有一个列表框
<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;
答案 0 :(得分:1)
在标记中,SelectedIndex
设置为-1,这意味着没有选择。在这种情况下,SelectedValue
和SelectedItem
都返回null。您可以通过将SelectedIndex
设置为0到3之间的值来解决此问题,也可以通过准备代码来处理SelectedValue
和SelectedItem
中的空值来解决此问题,例如
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);
}
或者至少是接近该解决方案的地方。