如何在WPF的列表框中获取所选项目的索引?

8

在您将此问题标记为重复或建议使用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)。

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


1
经过很多困惑(我相信你也有同样的困惑)。我认为发生的情况是获取了对象A的第一个索引,即0。你可以创建一个循环来获取所有的A的索引。 - Sayse
1
@Sayse:你说得对 - ListBox 将会选中第一个索引(同时,如果你点击第四个元素,通常第一个和第四个元素都会被高亮显示)。我在这个问题上发布了一个解决方案。 - Dan Puzey
@DanPuzey - 你的解决方案可能也是这个问题的答案。 - Sayse
2个回答

3

关于我的评论(“它正在获取对象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));

请注意:我并不打算将此作为对所提问的答案,而是进一步澄清。 - Sayse

3

这是由于你将同一个对象添加到列表中两次造成的。 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; }
}

(注意:这是我回答另一个问题的内容,链接在此,因为回答很有用但问题略有不同。)
你需要在 XAML 中设置你的 ListView 的 SelectionMode 属性为 Single。例如:
```xaml ```
然后,你可以通过监听 SelectionChanged 事件来获取选定项的数据。
希望这可以帮助到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接