Вы можете использовать стандартный ListBox для «ленивой загрузки» ваших товаров с привязкой к данным.Ключевое слово здесь - «виртуализация данных».Вы должны внедрить IList в класс, который хотите привязать к данным.Метод индексатора будет вызываться только для элементов, видимых в данный момент, и для следующих вычисленных ~ 2 экранов.Это также причина, по которой вам следует использовать сетку фиксированного размера для макета элемента, а не стековую панель с вычисленной высотой, основанной на всех содержащихся элементах (производительность!).
Вам не нужно реализовывать все IListЧлены, только некоторые.Вот пример:
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
}
Во время отладки вы можете видеть, что не все элементы загружаются одновременно, а только при необходимости (см. Debug.WriteLine ()).