With the latest update to the Windows Phone Toolkit they have overhauled the internals of the LongListSelector for the Mango release. One of the changes was removing support for the GetItemsInView()
function (it now returns an empty list). This function previously returned a list of items that were currently visible on the screen. I was using this to get a reference to the topmost visible item when navigating away from a page so that I could support recovery after a tombstone by using ScrollTo(object item)
.
Does anyone know what the suggested alternative would be? I know that with Mango tombstoning is much less of an issue, but I'd still like to support it and there may be some other scenarios where I'd want to recall the scroll position. My list has thousands of items in some cases.
From what I can tell from the new bits, you have to subscribe to the LLS's Link
and Unlink
events. Link
will pass in an arg that contains the item added to the visible part of the LLS. Unlink
does the same for those items removed from the LLS. So you'd do something like this:
List<string> trackedItems = new List<string>();
private void myListOfStrings_Link(object sender, LinkUnlinkEventArgs e)
{
var x = e.ContentPresenter;
if (x == null || x.Content == null)
return;
trackedItems.Add(x.Content.ToString());
}
private void myListOfString_Unlink(object sender, LinkUnlinkEventArgs e)
{
var x = e.ContentPresenter;
if (x == null || x.Content == null)
return;
trackedItems.Remove(x.Content.ToString());
}
Note that Link
and Unlink
will fire for EVERY rendered item in the underlying list, so if you're using the grouping features of the LLS, then you'll have to augment your test on whether or not to track the item based on what type is actually coming back. So if you have some sort of group object for which you want to track the underrlying objects, you might do something like this:
private void myGroupedListOfObjects_Link(object sender, LinkUnlinkEventArgs e)
{
var x = e.ContentPresenter;
if (x == null || x.Content == null)
return;
var myObject = x.Content as MyObject;
if (myObject != null)
{
foreach (var item in myObject.Items)
{
trackedItems.Add(item);
}
}
}
I hope this helps! Let us know if it works out.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With