繁体   English   中英

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

[英]How to get indices of selected items in WPF's listbox?

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

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));

这是由于您将同一对象添加到列表两次引起的。 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; }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM