Puede usar el ListBox estándar para "cargar de forma difusa" sus elementos con enlace de datos. La palabra clave aquí es "virtualización de datos". Tienes que implementar IList a la clase que deseas vincular. El método del indexador solo se llamará para los elementos actualmente visibles y para las siguientes pantallas ~ 2 calculadas. Esta es también la razón por la que debe usar una cuadrícula de tamaño fijo para el diseño de su artículo, no un panel de distribución con una altura calculada basada en todos los elementos que lo contienen (¡rendimiento!).
No tiene que implementar todos los miembros de IList, solo unos pocos. Aquí está un ejemplo:
public class MyVirtualList : IList {
private List<string> tmpList;
public MyVirtualList(List<string> mydata) {
tmpList = new List<string>();
if (mydata == null || mydata.Count <= 0) return;
foreach (var item in mydata)
tmpList.Add(item);
}
public int Count {
get { return tmpList != null ? tmpList.Count : 0; }
}
public object this[int index] {
get {
Debug.WriteLine("Just requested item #" + index);
return tmpList[index];
}
set {
throw new NotImplementedException();
}
}
public int IndexOf(object value) {
return tmpList.IndexOf(value as string);
}
public int Add(object value) {
tmpList.Add(value as string);
return Count - 1;
}
#region not implemented methods
public void Clear() {
throw new NotImplementedException();
}
public bool Contains(object value) {
throw new NotImplementedException();
}
public void Insert(int index, object value) {
throw new NotImplementedException();
}
public bool IsFixedSize {
get { throw new NotImplementedException(); }
}
public bool IsReadOnly {
get { throw new NotImplementedException(); }
}
public void Remove(object value) {
throw new NotImplementedException();
}
public void RemoveAt(int index) {
throw new NotImplementedException();
}
public void CopyTo(Array array, int index) {
throw new NotImplementedException();
}
public bool IsSynchronized {
get { throw new NotImplementedException(); }
}
public object SyncRoot {
get { throw new NotImplementedException(); }
}
public IEnumerator GetEnumerator() {
throw new NotImplementedException();
}
#endregion
}
Mientras que la depuración se puede ver que no todos los artículos se cargan a la vez, pero sólo cuando es necesario (ver Debug.WriteLine()).
Puede consultar este blog y el video de channel9 sobre lo mismo. El código fuente también está disponible. http://channel9.msdn.com/Shows/SilverlightTV/Silverlight-TV-72-Windows-Phone-Tips-for-Loading-Images http://jobijoy.blogspot.com/2011/05/wp7dev-tip-2 -few-things-to-remember-on.html –