2 Stimmen

WPF: SelectedItems mit doppelten Objektreferenzen

Nehmen wir also an, ich habe diese Klassen:

public class Person
{
     public string Name { get; set; }
}
public class PersonCollection : ObservableCollection<Person> { }

Und sagen wir mal, ich habe eine ListView, deren ItemsSource an eine PersonCollection gebunden ist. Nun, sagen wir, ich habe diesen Code:

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

So jetzt habe ich eine ListView mit drei Elementen, in denen alle drei Elemente Verweise auf das gleiche Objekt sind. Jetzt wähle ich also, sagen wir mal, Elemente mit Index 0 und 2 in der ListView aus.

Die ListView.SelectedItems-Eigenschaft sagt, dass ich EIN Element ausgewählt habe, da beide visuell ausgewählten Elemente das SELBE Objekt sind.

Wie kann ich also die visuell ausgewählten Elemente erhalten, so dass ich die Elemente bei den Indizes 0 und 2 entfernen kann, ohne das Element bei Index 1 zu entfernen?

2voto

Robert Macnee Punkte 11480

In WinForms gibt es die ListBox.SelectedIndices Eigenschaft, die hier nützlich wäre, aber wir haben das nicht in WPF, leider...

Sie könnten durch die ListViewItem s mit ItemContainerGenerator.ContainerFromIndex , prüfen ListViewItem.IsSelected und entfernen Sie sie dann per Index. Dies funktioniert jedoch nicht gut mit der Virtualisierung, weil ContainerFromIndex könnte null zurückgeben, wenn Sie vom Element wegblättern und es virtualisiert wird.

Der Code würde etwa so aussehen:

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

1voto

Michael Punkte 3410

Es gibt Fälle, in denen dies sinnvoll ist, z. B. das Hinzufügen von Personen zu einer Warteschlange, in der es wünschenswert ist, mehr als einmal zu erscheinen. Für diesen Fall scheint es wie WPF ist schlecht konzipiert. Ist es möglich, manuell zwischen allen Elementen in der Sammlung zu iterieren und ihren Auswahlstatus zu überprüfen?

-2voto

amaca Punkte 1410

Ich glaube, mit Ihrem Modell stimmt etwas nicht! Was auch immer Sie zu erreichen versuchen, ich würde versuchen, eine robustere Methode zu finden, um es zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X