【问题标题】:How to get indices of selected items in WPF's listbox?如何获取 WPF 列表框中所选项目的索引?
【发布时间】:2013-05-17 08:14:16
【问题描述】:

在将此问题标记为重复问题或建议使用 Items.IndexOf 之前,请执行以下操作:

public MainWindow()
{
    InitializeComponent();

    var A = new object();
    var B = new object();
    var C = new object();

    lbItems.Items.Add(A);
    lbItems.Items.Add(B);
    lbItems.Items.Add(C);
    lbItems.Items.Add(A);
    lbItems.Items.Add(B);
    lbItems.Items.Add(C);
}

private void lbItems_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show(lbItems.Items.IndexOf(lbItems.SelectedItems[0]).ToString());
}

然后双击第四个元素(你会得到 0 而不是 3)。

如何获取选定项索引的列表?

【问题讨论】:

  • 经过一番困惑,(我相信你的分享)。我认为发生的事情是它获取对象 A 的第一个索引,即 0。您可以创建一个循环来获取 A 的所有索引
  • @Sayse:你是对的——ListBox 会选择第一个索引(另外,如果你点击第四个元素,第一个和第四个元素通常都会被突出显示)。我在this question 上发布了一个解决方案。
  • @DanPuzey - 您的解决方案也可能是这个问题的答案。

标签: c# wpf listbox indexing selection


【解决方案1】:

进一步我的评论(“它获取对象 A 的第一个索引为 0”),

int j = 0;
for (int i = 0; i < lbItems.Items.Count; i++)
{
    if (lbItems.Items[i] == lbItems.SelectedItems[0])
      j++;
}
MessageBox.Show(lbItems.Items.IndexOf(lbItems.SelectedItems[0]).ToString()
+ string.Format("\r\nThere are {0} occurences of this object in this list", j));

【讨论】:

  • 注意:我不打算以此作为对所提问题的回答,而是进一步澄清
【解决方案2】:

这是由于您将同一对象添加到列表中两次造成的。 ListBox 控件无法区分它们。解决此问题的一种方法是将每个项目包装在另一个类中:

lbItems.Items.Add(new WrappedThing((a));
lbItems.Items.Add(new WrappedThing((b));
lbItems.Items.Add(new WrappedThing((a));
lbItems.Items.Add(new WrappedThing((b));

... 这意味着列表中的每个项目都是唯一的,即使它们包装的项目可能不是。请注意,任何数据模板或绑定也必须更改以支持此功能,但您可以使用单个全局 DataTemplate 来完成此操作。

WrappedThing 看起来像这样:

class WrappedThing<T>
{
    public WrappedThing(T thing)
    {
        Thing = thing;
    }

    public T Thing { get; private set; }
}

(注意:这是从我对另一个问题here 的回答复制而来,因为答案很有用,但问题略有不同。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2011-08-10
    • 2017-06-09
    • 2015-10-20
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多