Laden...

[Gelöst] ListView, dass zuletzt hinzugefügt Item anzeigen.

Erstellt von malu vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.637 Views
M
malu Themenstarter:in
37 Beiträge seit 2007
vor 14 Jahren
[Gelöst] ListView, dass zuletzt hinzugefügt Item anzeigen.

Hallo zusammen,
ich habe eine WPF Listview, das als ItemsSource eine Observeable Collection besitzt. Die Synchronistation zwischen Observable Collection und ListView funktioniert hervorragend, nur muss bei mir in der Anwendung, immer das zuletzt hinzugefügt Item sichtbar sein. Ich habe zusätztlich das ObservableCollectionChanged Event im CodeBehind angebunden.


//Observable CollectionChanged
ObjBLMain.ObjInfoBoxItems.CollectionChanged
  += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(ObjInfoBoxItems_CollectionChanged);


Die Mehtode wird korrekt aufgerufen. Ich habe nun noch das Problem, meine ListView so scrollen zu lassen, dass das letzte hinzugefügt Item angezeigt wird.

Kann mir jemand helfen ??

H
222 Beiträge seit 2010
vor 14 Jahren

moin,

dafür hat das ListViewItem eine eingebaute Methode:


ListView.Items[Index].EnsureVisible();

//edit: hmm da war ich wohl etwas vorschnell, ich hab das so in einer formanwendung drin. warum gehts das denn bei WPF nicht???

mfg Hurby

Die Welt hat genug für jedermanns Bedürfnisse, aber nicht für jedermanns Gier.

D
462 Beiträge seit 2005
vor 14 Jahren

dafür hat das ListViewItem eine eingebaute Methode:

  
ListView.Items[Index].EnsureVisible();  
  

//edit: hmm da war ich wohl etwas vorschnell, ich hab das so in einer formanwendung drin. warum gehts das denn bei WPF nicht???


ListView.Items[Index].BringIntoView();

Habs zwar nicht getestet, aber laut Doku scheints das zu sein.

mfg

M
malu Themenstarter:in
37 Beiträge seit 2007
vor 14 Jahren

Erst mal schönen Dank für Deine Mühe.

Die Anwort sieht vielversprechend aus, nur leider kann ich nicht in ein ListViewItem casten.


void ObjInfoBoxItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
   ListViewItem Test =    
    lvwApplicationInformations.Items[lvwApplicationInformations.Items.Count - 1] as   
    ListViewItem;

   //der Cast läuft schief Test ist null
   if (Test != null)
   {
	Test.BringIntoView();
   }
}

U
1.578 Beiträge seit 2009
vor 14 Jahren

Du musst dir erst den entsprechenden ItemContainer besorgen, wie genau kann ich dir gerade nicht sagen, aber dürftest das als Stichwort für die Suche gebrauchen können.

M
malu Themenstarter:in
37 Beiträge seit 2007
vor 14 Jahren

Dem ItemContainer habe ich mir besorgt, der cast funktioniert jezt, nur die Methode BringIntoView() machts leider nicht. Mein aktueller Code:


void ObjInfoBoxItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{

			
  ListViewItem item = (ListViewItem)  (this.lvwApplicationInformations
  .ItemContainerGenerator.ContainerFromIndex(lvwApplicationInformations.Items
  .Count - 1));

  if (item != null)
  {
     item.BringIntoView(); 
  }
}

die var item ist nicht mehr null, leider funktioniert die Methode "BringIntoView()" nicht.

D
462 Beiträge seit 2005
vor 14 Jahren

Hi,

Habe mich gerade etwas damit auseinandergesetzt und bin zur Erkenntnis gelangt, dass es mit dem VirtualizingStackPanel (welches von der ListView standardmäßig verwendet wird) zu tun hat: Dabei werden die Container nämlich nicht sofort sondern erst bei Bedarf erzeugt und führt daher gelegentlich zu den Null-Referenzen bei GetContainerFrom...()-Aufrufen.

Du müsstest auf StatusChanged vom ContainerGenerator reagieren und wenn dieser fertig ist, kannst du die GetContainer-Methoden aufrufen sowie dann BringIntoView().



void _list_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
	listview.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
}

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
	if (listview.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
	{
		((ListViewItem)listview.ItemContainerGenerator.ContainerFromIndex(listview.Items.Count - 1)).BringIntoView();
		listview.ItemContainerGenerator.StatusChanged -= new EventHandler(ItemContainerGenerator_StatusChanged);
	}
}

So funktionierts bei mir.

lg

M
malu Themenstarter:in
37 Beiträge seit 2007
vor 14 Jahren
[Gelöst] ListView, dass zuletzt hinzugefügt Item anzeigen.

Hallo zusammen,
die von DeveloperX erstellte Lösung funktioniert. Ich Danke Allen, die sich am Thread beteiligt haben. 👍