2009-03-11 11 views
2

können also sagen, ich habe diese Klassen:WPF: SelectedItems mit doppelten Objektreferenzen

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

Und lässt sagen, ich habe ein Listview dessen Itemssource ist an einem PersonCollection gebunden. Jetzt kann sagen, 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 ein Listview mit drei Elementen, in denen alle drei Elemente Verweise auf das gleiche Objekt sind. So, jetzt wähle ich lies sagen Artikel mit Index 0 und 2 in der ListView.

Die ListView.SelectedItems-Eigenschaft wird sagen, ich habe ein Element ausgewählt, da beide visuell ausgewählte Elemente das gleiche Objekt sind.

Also wie kann ich 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?

Antwort

2

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

Sie durch die ListViewItem s ItemContainerGenerator.ContainerFromIndex mit laufen könnte, ListViewItem.IsSelected überprüfen und dann entfernen sie nach Index. Dies funktioniert jedoch nicht gut mit der Virtualisierung, da ContainerFromIndex null zurückgeben kann, wenn Sie vom Element wegrollen und es virtualisiert wird.

Der Code würde wie folgt aussehen:

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

Danke das hat funktioniert. Ich bin nicht ganz sicher, was Sie mit Virtualisierung meinen, aber mit dem einfachen Projekt, das wir machen, wird uns das genügen. Vielen Dank. – Nick

+0

Was ich meine ist, dass manchmal nicht jede Person in der Items-Auflistung ein ListViewItem aufgrund der Virtualisierung hat. Wenn Sie die erste Person in der ListView auswählen und dann nach unten scrollen, damit sie verschwindet, ist es möglich, dass der Aufruf von ItemContainerGenerator.ContainerFromIndex (0) null zurückgibt. –

-2

Ich glaube, mit Ihrem Modell stimmt etwas nicht! Was auch immer Sie versuchen zu erreichen, ich würde versuchen, einen robusteren Weg zu finden.

+0

Was meinen Sie? Vielleicht ist das die Funktionalität, die ich will. Wenn Sie ein Problem mit meiner Geschäftslogik haben, dann lassen Sie mich in Ruhe. – Nick

1

Es gibt Fälle, in denen dies sinnvoll ist, indem man Personen zu einer Warteschlange hinzufügt, in der beispielsweise mehr als einmal angezeigt wird. Für diesen Fall scheint WPF schlecht konzipiert zu sein. Ist es möglich, manuell zwischen allen Elementen in der Sammlung zu iterieren und ihren Auswahlstatus zu überprüfen?

+0

So etwas habe ich noch nicht gefunden, aber das wäre schön. – Nick

Verwandte Themen