2009-03-11 10 views
2

WPF:重複するオブジェクト参照を持つSelectedItems

そして、ItemsSourceがPersonCollectionにバインドされているListViewがあるとします。さて、私はこのコードがあると言うことができます:

public void AddPeople() 
{ 
    Person p = new Person() { Name = "Someone" }; 
    MyPersonCollection.Add(p); 
    MyPersonCollection.Add(p); 
    MyPersonCollection.Add(p); 
} 

だから今私は3つの項目がすべて同じオブジェクトへの参照である3つの項目を持つListViewを持っています。だから今私はListViewでインデックス0と2のアイテムを言うことを選択します。

ListView.SelectedItemsプロパティは、視覚的に選択された両方のアイテムが同じオブジェクトであるため、1つのアイテムが選択されていると表示されます。

したがって、インデックス1のアイテムを削除せずに、インデックス0と2のアイテムを削除できるように、視覚的に選択したアイテムを取得するにはどうすればよいですか?

答えて

2

あり、ここで有用であろうListBox.SelectedIndicesプロパティがあるが、私たちはWPFには、残念ながら...

あなたは、ItemContainerGenerator.ContainerFromIndexを使用してListViewItem Sを反復処理ListViewItem.IsSelectedをチェックし、削除ができることはありませんそれらをインデックスで表示します。しかし、ContainerFromIndexはアイテムからスクロールして仮想化するとnullを返す可能性があるため、仮想化ではうまくいきません。

for(int ixPerson = myListView.Items.Count - 1; ixPerson >= 0; ixPerson--) 
{ 
    ListViewItem personItem = myListView.ItemContainerGenerator.ContainerFromIndex(ixPerson); 
    if (personItem.IsSelected) 
    { 
     mySourcePersonCollection.RemoveAt(ixPerson); 
    } 
} 
+0

ありがとうございました。私はあなたが仮想化について何を意味しているのかよく分かりませんが、私たちがやっている単純なプロジェクトでは、これで十分です。ありがとう。 – Nick

+0

私が意味することは、Itemsコレクション内のすべてのPersonが、仮想化のためListViewItemを持たないことがあるということです。 ListViewで最初のPersonを選択し、それが消えるようにスクロールダウンすると、ItemContainerGenerator.ContainerFromIndex(0)を呼び出すとnullが返される可能性があります。 –

-2

あなたのモデルに問題があると思います。あなたが達成しようとしていることが何であれ、私はもっと頑強な方法を見つけようとします。

+0

あなたは何を意味する:

コードは次のようになりますか?たぶん、これは私が望む機能です。私のビジネスロジックに問題がある場合は、私を放置してください。 – Nick

1

複数の出現が望まれるキューに人を追加することは意味がある場合があります。この場合、WPFがうまく設計されていないようです。コレクション内のすべてのアイテムを手動で繰り返し処理し、選択状態を確認できますか?リサイズで

+0

これまでのようなことは何も見つかりませんでしたが、それはいいと思います。 – Nick

関連する問題