Xaml 如何在UWP的增量(延迟)加载的ListView中实现SearchBox功能
我在UWP应用程序中有一个ListView,它在第一次加载时绑定100个项目,然后在加载完成后绑定另100个项目,即增量加载 下面是一个代码:Xaml 如何在UWP的增量(延迟)加载的ListView中实现SearchBox功能,xaml,listview,uwp,search-box,Xaml,Listview,Uwp,Search Box,我在UWP应用程序中有一个ListView,它在第一次加载时绑定100个项目,然后在加载完成后绑定另100个项目,即增量加载 下面是一个代码: <ListView x:Name="lstWords" ItemsSource="{Binding Items}" DataFetchSize="1" IncrementalLoadingTrigger="Edge" IncrementalLoadingThreshold="5" SelectionChanged="lstItems_Selecti
<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>
将此ListView与增量加载(延迟加载)绑定的代码如下:
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; }
}
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;
}
}
}
public类IncrementalLoadingCollection:ObservableCollection,ISupportIncrementalLoading
{
uint x=1;
public bool HasMoreItems{get{return x<10000;}
公共IAsyncOperation LoadMoreItemsAsync(uint计数)
{
var page=新索引();
string Id=localSettings.Values[“Id”].ToString();
返回AsyncInfo.Run(async cancelToken=>
{
var apiData=wait page.GetData(Id,x.ToString());
foreach(apiData中的var i)
{
添加(新词()
{
Name=i.Name,ID=i.ID
});
}
x+=(uint)apiData.Count();
返回新的LoadMoreItemsResult{Count=(uint)apiData.Count()};
});
}
}
公共类ViewModelWords
{
公共ViewModelWords()
{
Items=新的增量AlloadingCollection();
}
public IncrementalLoadingCollection项{get;set;}
}
这里提到的GetData()方法的代码在另一个类索引中&如下所示:
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; }
}
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;
}
}
}
公共密封部分类索引:第页
{
List loadedList=新列表();
公共类词汇
{
公共字符串ID{get;set;}
公共字符串名称{get;set;}
公共重写字符串ToString(){返回this.Name;}
}
公共异步任务GetData(字符串Id、字符串限制)
{
字符串mainUrlForWords=ApiUrl
使用(var httpClient=new httpClient())
{
var dataUri=wait-httpClient.GetStringAsync(mainUrlForWords);
JsonObject JsonObject=JsonObject.Parse(dataUri.ToString());
JsonArray JsonArray=jsonObject[“有效负载”].GetArray();
foreach(jsonArray中的JsonValue组值)
{
JsonObject groupObject=groupValue.GetObject();
loadedList.Add(新词{Name=groupObject.GetNamedString(“Name”),ID=groupObject.GetNamedString(“ID”)});
}
返回加载列表;
}
}
}
如问题中所述,我希望为上述ListView实现searchBox功能,即列表中已加载项目(例如100个项目),现在在searchBox中,我将在ListView中的项目中输入匹配项的任何单词/文本,它应根据输入的单词/文本仅返回匹配项
e、 g.假设listview项如下所示:
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; }
}
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;
}
}
}
Abbasds、Abbsdf、ABCdef、Adehf
如果我输入'ab',它必须返回以下项目:Abbasds、Abbsdf、ABCdef
如果我输入'Abb',则必须返回:Abbasds,Abbsdf
我已尝试使用以下代码实现上述功能:
<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()));
}
}
专用无效搜索词(搜索框发件人、搜索框QueryChangedEventArgs e)
{
如果(loadedList.Count>0)
{
lstWords.ItemsSource=loadedList.Where(a=>a.ToString().ToUpper().Contains(searchWords.QueryText.ToUpper());
}
}
但它未能实现上述功能。
调试代码loadedList.count时显示为0。在应用程序视图中,ListView加载了项目&可以在UI页面上看到
任何人都能解决这个问题或为SearchBox功能提供适当的解决方案吗?您的
IncrementalLoadingCollection
创建了一个毫无意义的索引
页面的新实例
我猜您只是想从列表框中获取项目:
private void search_Words(SearchBox sender, SearchBoxQueryChangedEventArgs e)
{
lstWords.ItemsSource = listBox.Items.OfType<Words>().Where(a => a.ToString().ToUpper().Contains(searchWords.QueryText.ToUpper())).ToArray();
}
private void search_Words(SearchBox发送者,SearchBoxQueryChangedEventArgs e)
{
lstWords.ItemsSource=listBox.Items.OfType()。其中(a=>a.ToString().ToUpper()包含(searchWords.QueryText.ToUpper())).ToArray();
}
什么是loadedList
以及您在视图中在何处初始化此字段?为什么不使用CollectionView
?@TomerAgmon1能否请您提供有关CollectionView
的更多指导以及编码示例?@mm8loadedList
是类型的列表
请参阅更新的问题和代码这是一个关于CollectionView
和代码示例。您的解决方案看起来相当不错,但这里有一些复杂问题:在这种情况下,listBox
是什么?另外,假设有100个项目绑定到列表视图&如果我在搜索框中键入'ab',它将返回以ab
开头的项目&这很好,但是如果我使用退格从'ab'中删除'b',那么在这种情况下,您的条件将失败。假设100项中有30项与查询字符串'ab'匹配。。下次如果我从“ab”中删除“b”,它将仅从这30个项目中返回以“a”开头的项目,而不是从100个项目中返回。listBox是视图中的listBox。我假设SearchBox和ListBox属于同一个视图。然后它将类似于lstWords.ItemsSource=lstWords.Items.OfType()。
,在这种情况下,如果我将搜索查询中的任何字符退格,则条件将失败。i、 e.如果searchQuery:ab
返回10条记录,那么在从ab
退格b
后,它将只搜索这10个项目中的字符串,而不是所有项目中的字符串,即在本例中为100@ace所以在这种情况下,您应该从这10个项目中创建查询,并选择兼容的项目作为ItemsSource
,以使它们显示在结果中。@BreezeLiu MSFT是的,事情正在进行,我想要的是在所有100个可用项目中搜索项目,而不是在10个项目中搜索项目