我现在已经尝试了2天将所选值从listBox保存到变量。我能找到的所有建议都不起作用,并且不鼓励使用实际工作的唯一建议。有人可以帮助我,告诉我我做错了什么吗?
我为这个帖子做了尽可能简单的代码。 WPF和C#都是。在de code中,我展示了我在这个论坛和其他论坛上发现的工作方式的不同建议。
1。 测试01和测试02确实编译好了,但他们都给了我相同的错误结果。
结果在TextBox中: System.Windows.Controls.ListBoxItem:ListBox Item 02
查看结果和代码,我可以理解'测试2'的结果。它看起来像是对我实际想要的内容的参考,并且' SelectedItem'可以建议一下。但随后在测试01'我得到了相同的结果,但我要求的是价值而不是参考。为什么呢?
2。 最常见的建议方法是测试04'。我尝试过的所有东西都给我带来了或多或少相同的错误。
错误消息:编译器错误CS1061:' ListBox'不包含' GetItemText'的定义没有延伸方法' name'接受类型'类型'的第一个参数。可以找到(您是否缺少using指令或程序集引用?)。
这也是最短最简单的方法,所以我真的想让这个方法起作用。也许我在其他地方做错了(VS 2015中的设置也许???)。我之前看过同样的信息,但那段时间我能够解决它。
3。 就在决定在这里发布之前我想再试一次。 '测试03'我在本网站的另一篇文章中看到的是评论,这不是这样做的方式。好的,原始帖子已被编辑,所以我不知道最初发布的是什么,但这是迄今为止实际工作的唯一的事情。但是,原来的帖子被建议反对。
我是WPF和C#的新手。通常情况下,我可能需要时间来了解如何做事,但我最终会到达那里,但这次我并不真正理解发生了什么事,而且有些事情告诉我,我做错了什么。有人可以如此善意地阐述上面列出的一个,部分或全部项目吗?我现在就开始工作了,但这是最好的解决方法吗?
背后的代码(C#):
using System.Windows;
using System.Windows.Controls;
namespace NLTrader
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
///textBox.Text = listBox.SelectedValue.ToString(); ///Test 01
///textBox.Text = listBox.SelectedItem.ToString(); ///Test 02
textBox.Text = ((ListBoxItem)listBox.SelectedItem).Content.ToString(); ///Test 03
///textBox.Text = listBox.GetItemText(); ///Test 04
}
}
}
WPF代码:
<Window x:Class="NLTrader.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:NLTrader"
mc:Ignorable="d"
Title="MainWindow" Height="555" Width="900">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel
x:Name="mainSettings"
Grid.Row="0">
<ListBox
x:Name="listBox"
SelectionChanged="listBox_SelectionChanged">
<ListBoxItem>ListBox Item 01</ListBoxItem>
<ListBoxItem>ListBox Item 02</ListBoxItem>
<ListBoxItem>ListBox Item 03</ListBoxItem>
</ListBox>
</StackPanel>
<TextBox
x:Name="textBox"
Grid.Row="1">
</TextBox>
</Grid>
</Window>
非常感谢你的时间和帮助。
编辑:p.s.我只是注意到,为了看到代码中的注释标识哪个是&#39;测试01,&#39;测试02&#34;,&#39;测试03&#39;和&#39;测试04&#39;您需要将滚动条向右移动。
编辑:我还注意到,当我将上述工作代码放在需要的代码(不同的项目)时,我也会收到错误。流失的最后一点兴奋......哈哈。
结构非常相似。 c#代码如下。
public void ListingAccounts_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
textBoxAccountSettingsAccountName.Text = ((ListBoxItem)ListingAccounts.SelectedItem).Content.ToString();
}
错误消息:未处理的类型&#39; System.InvalidCastException&#39;发生在NLTrader.exe中 附加信息:无法转换类型为&#39; System.String&#39;的对象输入&#39; System.Windows.Controls.ListBoxItem&#39;。
Screenshot from VS2015 Debugger Error Message
所以现在我比以前更加茫然。请帮帮我。
答案 0 :(得分:0)
当您将鼠标悬停在SelectedItem
上时会说什么?如果它是string
(并且InvalidCastException似乎这样说),你应该能够做到
textBoxAccountSettingsAccountName.Text = ListingAccounts.SelectedItem.ToString()
如果你还没有,我建议你看http://www.wpf-tutorial.com/list-controls/listbox-control/。
只需注意:SelectionChangedEventArgs确实有选择,就在那里! :P
编辑:我无法评论,但只是警告@ funk的答案,e.AddedItems[0]
将在取消选择选择时抛出indexoutofRange异常(因为没有“添加”),所以你应该使用`e。如果您使用他的解决方案,AddedItems.FirstOrDefault()并检查null。我认为这个解决方案也是如此,当取消选择发生时,SelectedItem将为null
答案 1 :(得分:0)
今天我也遇到了这个问题。我要做的两件事很简单: 1.在我的项目中添加一个程序集引用:System.Windows.Forms 2.使用Eric van der Toorn发布的教程,我实现了以下代码;
{
if (upldListBox.SelectedItem != null)
{
string uploadFile = upldListBox.SelectedItem.ToString();
exec.UploadToStHost(uploadFile);
}
}
希望这会有所帮助。