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

次に、4 番目の要素をダブルクリックします (3 ではなく 0 が表示されます)。

選択したアイテムのインデックスのリストを取得するには?

4

2 に答える 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));
于 2013-05-22T10:39:39.290 に答える
3

これは、同じオブジェクトをリストに 2 回追加したことが原因です。コントロールはそれらのListBox間を区別できません。この問題を回避する 1 つの方法は、各項目を別のクラスでラップすることです。

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

...これは、リスト内の各アイテムが一意であることを意味しますが、それらがラップしているアイテムは一意ではない可能性があります. 単一の global でこれを行うことはできますが、これをサポートするには、データ テンプレートまたはバインディングも変更する必要があることに注意してくださいDataTemplate

WrappedThing次のようになります。

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

    public T Thing { get; private set; }
}

(注:これは私の回答から別の質問にコピーされています回答は役に立ちますが、質問はわずかに異なるためです。)

于 2013-05-22T10:41:46.160 に答える