C# [WPF / MVVM] von ListView auf ListViewItems zugreifen

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hallo zusammen,
ich versuche mein Problem mal sehr begrenzt darzustellen:
Ich habe für eine ListView ein Behavior (DependencyProperty SelectedItems) implementiert. Man kann ja leider nur auf ein Element (SelectedItem) einer Liste binden, was in "SelectionMode = Multi" ziemlich mies ist.

Naja, auf jeden Fall kann ich jetzt eine Liste von Objekten versorgen, die mir alle selektierten Items abspeichert. Diese Liste ist in meinem ViewModel. Verlasse ich nun die View und öffne diese wieder, geht natürlich die Selektion verloren. Ich möchte aber die vorherige Selektion wieder anzeigen.

Die SelectedItem-Liste im ViewModel konnte ich wieder versorgen. Jetzt möchte ich diese Liste als ListView.SelectedItems verwenden. Geht aber nicht, da diese Property "readonly" ist.

Also dachte ich mir ich iteriere einfach über die ViewModel.SelectedItems-Liste und setzte für jedes Item, dass mit einem Item aus ListView.Items übereinstimmt das IsSelected Flag auf true. Blöderweise ist IsSelected eine Property vom ListViewItem und ich habe keine Ahnung wie ich daran komme. Kann mir da einer helfen?

Angeblich soll es so gehen - bei mir kommt dann aber eine Liste mit null raus:
Code:
List<ListViewItem> listViewItems = new List<ListViewItem>();

foreach (object item in listView.Items)
{
	ListViewItem lvi = (ListViewItem)listView.ItemContainerGenerator.ContainerFromItem(item);
	listViewItems.Add(lvi);
}

Nachfolgenden noch etwas Code um gewisse Dinge zu verdeutlichen:

Eigene DependencyProperty:
Code:
public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register( 
	"SelectedItems", 
	typeof(List<object>), 
	typeof(KlassenNameBehavior), 
	new FrameworkPropertyMetadata(OnSelectedItemsChanged));

Zugriff nur wenn ListView inizialisiert wurde und beim vorherigen schließen der View die ListView eine Selektion hatte:
Code:
private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
	if (e.OldValue == null && e.NewValue != null)
	{
		// Liste mit selektierten Items aus ViewModel
		List<object> newList = e.NewValue as List<object>;

		KlassenNameBehavior behavior= d as KlassenNameBehavior;

		if (newList != null && newList.Count > 0 && behavior != null)
		{
			ListView listView = behavior.AssociatedObject;
		}
	}
}


Edit:
In der Methode OnSelectedItemsChanged ist listView.View immer null! Bin gerade am prüfen, ob das ein Problem ist.
 
Zuletzt bearbeitet: (Edit)
Hey Leute,

ich hab jetzt einiges ausprobiert und verschiedene lauffähige Versionen gehabt. Aber
das wirklich beste und einfachste ist ein Add auf die Property SelectedItems der ListView zu machen :Freak

Daran habe ich nicht gedacht. Also anstatt:
Code:
listView.SelectedItems = selektierteItemsListe;

Kann ich jedes Element aus meiner Liste der listView.SelectedItems Property zuweisen.
Mit Linq dann auch als Einzeiler!
Code:
foreach(var item in selektierteItemsListe)
{
	listView.SelectedItems.Add(item);
}

Natürlich müsst ihr vorher noch prüfen, ob die Objekte in der selektierteItemsListe überhaupt in der SelectedItems-Property vorkommen. Hoffe das hilft dem ein oder anderen.
 
Zurück
Oben