1

我有一个TextBoxWPF 和一个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”类型

我会很感激你的。

4

5 回答 5

6

错误消息说明listAmount.Items[i]返回类型的实例ListBoxItem。该类派生自ContentControl,这就是为什么它的Content属性应该包含您要查找的实际值的原因。

因此,尝试:

sum += Convert.ToInt32(((ListBoxItem)listAmount.Items[i]).Content);

类型转换是必要的,因为索引器的ItemCollection类型是object.


也就是说,您是否尝试过使用集合(例如 an ObservableCollection<int>)来存储您的值并将该集合设置ItemsSource为您的列表框?然后,您可以直接从您的集合中获取和总结整数值,而无需进行任何转换。

将此声明添加到您的窗口以存储整数值列表:

private readonly ObservableCollection<int> values = new ObservableCollection<int>();

然后,在您调用 后InitializeComponents,分配ItemsSource属性:

listAmount.ItemsSource = values;

随时在列表中添加和删除您的值values;列表的内容将始终由列表框反映。

为了检索这些值的总和,您可以简单地使用以下命令:

int sum = values.Sum();

请注意,System.Linq命名空间需要包含在using指令中才能正常工作,否则将找不到该Sum方法。)

于 2013-07-26T11:49:24.380 回答
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<> 适应你使用的任何东西)。

  var numbers = new[] { 1, 2, 3, 4, 5, 6 };
  var listBox = new ListBox {ItemsSource = numbers};

  var sum = listBox.Items.Cast<int>().Sum();
于 2013-07-26T11:47:31.997 回答
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();
于 2013-07-26T11:53:32.383 回答
-2

利用 :

listAmount.Items[i].ToString()
于 2013-07-26T11:44:05.950 回答
-3

可能有一种更清洁的方法,但这

 var items = listAmount.Items;
        int SUM;
        foreach (var item in items)
        {
            int itemvalue = Convert.ToInt32(item.ToString());

            SUM += itemvalue;
        }
于 2013-07-26T11:49:04.387 回答