C# 如何在WPF'中获取所选项目的索引;什么是列表框?

C# 如何在WPF'中获取所选项目的索引;什么是列表框?,c#,wpf,listbox,indexing,selection,C#,Wpf,Listbox,Indexing,Selection,在将此问题标记为重复问题或建议使用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);

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

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

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; }
}
类包装
{
公共包装(T类物品)
{
事物=事物;
}
公共T对象{get;私有集;}
}

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

经过多次混淆之后(我相信您会分享)。我认为它得到的是object
A的第一个索引,即0。您可以创建一个循环来获取
a
@Sayse的所有索引:您是正确的-
列表框将拾取第一个索引(此外,如果您单击第四个元素,第一个和第四个元素通常都会高亮显示)。我在@DanPuzey上发布了一个解决方案-您的解决方案可能也是这个问题的答案。注意:我不打算将此作为对所问问题的回答,而是进一步澄清
class WrappedThing<T>
{
    public WrappedThing(T thing)
    {
        Thing = thing;
    }

    public T Thing { get; private set; }
}