I have a ListView in UWP Application which binds 100 items on 1st load, then after loading is completed it binds another 100 i.e. it is incrementally loaded.
Here is a code :
<ListView x:Name="lstWords" ItemsSource="{Binding Items}" DataFetchSize="1" IncrementalLoadingTrigger="Edge" IncrementalLoadingThreshold="5" SelectionChanged="lstItems_SelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"></TextBlock>
<TextBlock Text="{Binding ID}" Visibility="Collapsed"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
And the code which binds This ListView with incremental loading (Lazy loading) is as follows :
public class IncrementalLoadingCollection : ObservableCollection<Words>, ISupportIncrementalLoading
{
uint x = 1;
public bool HasMoreItems { get { return x < 10000; } }
public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
{
var page = new Index();
string Id = localSettings.Values["Id"].ToString();
return AsyncInfo.Run(async cancelToken =>
{
var apiData = await page.GetData(Id, x.ToString());
foreach (var i in apiData)
{
Add(new Words()
{
Name = i.Name, ID=i.ID
});
}
x += (uint)apiData.Count();
return new LoadMoreItemsResult { Count = (uint)apiData.Count() };
});
}
}
public class ViewModelWords
{
public ViewModelWords()
{
Items = new IncrementalLoadingCollection();
}
public IncrementalLoadingCollection Items { get; set; }
}
The code for GetData() method mentioned here is in another class Index & is as follows :
public sealed partial class Index : Page
{
List<Words> loadedList = new List<Words>();
public class Words
{
public string ID { get; set; }
public string Name { get; set; }
public override string ToString() { return this.Name; }
}
public async Task<IEnumerable<Words>> GetData(string Id, string limit)
{
string mainUrlForWords = ApiUrl
using (var httpClient = new HttpClient())
{
var dataUri = await httpClient.GetStringAsync(mainUrlForWords);
JsonObject jsonObject = JsonObject.Parse(dataUri.ToString());
JsonArray jsonArray = jsonObject["payload"].GetArray();
foreach (JsonValue groupValue in jsonArray)
{
JsonObject groupObject = groupValue.GetObject();
loadedList.Add(new Words { Name = groupObject.GetNamedString("name"), ID = groupObject.GetNamedString("id") });
}
return loadedList;
}
}
}
As mentioned in the question i want to implement searchBox functionality for above ListView i.e. the List is already loaded with items say 100 items, now in searchBox i will enter any word/text for the matches in items in the ListView, it should return only matched items based on word/text entered.
e.g. suppose listview items are as follows :
Abbasds, Abbsdf, ABCdef, Adehf
If i type 'ab' it must return following items : Abbasds, Abbsdf, ABCdef
If i type 'Abb' is must return : Abbasds, Abbsdf
I have tried implementing the said functionality using following code :
<SearchBox x:Name="searchWords" QueryChanged="search_Words" PlaceholderText="Filter by..."></SearchBox>
private void search_Words(SearchBox sender, SearchBoxQueryChangedEventArgs e)
{
if (loadedList.Count>0)
{
lstWords.ItemsSource = loadedList.Where(a => a.ToString().ToUpper().Contains(searchWords.QueryText.ToUpper()));
}
}
But it fails to achieve the said functionality. When i debugged the code loadedList.count showed 0. while on App View ListView is loaded with items & can be seen on UI page.
Can anyone figure this out or provide some appropriate solution for the SearchBox functionality??