我在WPF中有TextBox
和ListBox
。 ListBox
(listAmount)包含一些值,我希望TextBox
(txtTotalAmount)中的值总和。
我目前正在使用此代码:
int i = 0;
int sum = 0;
for (i = 0; i < listAmount.Items.Count; i++)
{
sum = sum + Convert.ToInt32(listAmount.Items[i]);
}
txtTotalAmount.Text = sum.ToString();
我收到了这个错误:
无法将'System.Windows.Controls.ListBoxItem'类型的对象强制转换为 输入'System.IConvertible'
我会很高兴你。
答案 0 :(得分:6)
错误消息说明listAmount.Items[i]
返回ListBoxItem
类型的实例。该类派生自ContentControl
,这就是为什么其Content
property应包含您要查找的实际值。
因此,请尝试:
sum += Convert.ToInt32(((ListBoxItem)listAmount.Items[i]).Content);
必须进行类型转换,因为indexer of ItemCollection
已输入object
。
也就是说,您是否尝试使用集合(例如ObservableCollection<int>
)来存储您的值并将该集合设置为列表框的ItemsSource
?然后,您可以直接从您的集合中获取并总结整数值,而无需转换任何内容。
将此声明添加到窗口以存储整数值列表:
private readonly ObservableCollection<int> values = new ObservableCollection<int>();
然后,在致电InitializeComponents
后,分配ItemsSource
属性:
listAmount.ItemsSource = values;
随时随地在values
列表中添加和删除您的值;列表的内容将始终由列表框反映出来。
要检索这些值的总和,您只需使用以下内容:
int sum = values.Sum();
请注意,using
指令需要包含System.Linq
namespace才能生效,否则将无法找到Sum
method。
答案 1 :(得分:3)
我建议另一种方法可以更好地融合WPF / XAML。
在Textbox.Text上使用绑定,并在绑定到的对象中创建属性。在属性的getter中执行数学运算。我会限制每次更改时手动分配Textbox.Text值。绑定是WPF最大的优势之一VS Winforms。
这当然要求您的对象实现INotifyPropertyChanged接口。 http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
编辑:如果您必须在没有绑定的情况下执行此操作,我建议使用LINQ查询进行总结。简单而优雅(对于这个例子,我的ListBox有一个ItemSource,如果是整数则是一个数组。你当然必须使Cast&lt;&gt;适应你正在使用的任何东西。)
var numbers = new[] { 1, 2, 3, 4, 5, 6 };
var listBox = new ListBox {ItemsSource = numbers};
var sum = listBox.Items.Cast<int>().Sum();
答案 2 :(得分:1)
如果你知道它们将永远是整数,你可以使用Linq
listAmmount.Items.Cast<string>().Sum(x => int.Parse(x)).ToString();
修改强>
在wpf中测试
textBox1.Text = listBox1.Items.Cast<ListBoxItem>().Sum(x => Convert.ToInt32(x.Content)).ToString();
答案 3 :(得分:-2)
使用:
listAmount.Items[i].ToString()
答案 4 :(得分:-3)
可能有一种更清洁的方式,但是这个
var items = listAmount.Items;
int SUM;
foreach (var item in items)
{
int itemvalue = Convert.ToInt32(item.ToString());
SUM += itemvalue;
}