Xaml 如何在UWP的增量(延迟)加载的ListView中实现SearchBox功能

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

我在UWP应用程序中有一个ListView,它在第一次加载时绑定100个项目,然后在加载完成后绑定另100个项目,即增量加载

下面是一个代码:

<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
的更多指导以及编码示例?@mm8
loadedList
是类型的列表
请参阅更新的问题和代码这是一个关于
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个项目中搜索项目