Xamarin IMobileServiceTable 不过滤

Xamarin IMobileServiceTable Not Filtering

我在数据访问层中使用 IMobileServiceTable class 并将其绑定到列表视图。初始加载工作正常,但过滤没有。它总是 returns 初始加载的数据。

public class ItemsManager {

    IMobileServiceTable<Item> itemTable;

    public ItemsManager (IMobileServiceTable<Item> todoTable) 
    {
        this.itemTable = todoTable;
    }


    public async Task<List<Item>> GetTasksAsync (string searchString)
    {
//following doesn't work
            var list = new List<Item> (await itemTable.Where(x => x.ItemID.Contains(searchString)).ToListAsync());
            return list;

    }

    public async Task<List<Item>> GetTasksAsync ()
    {
            return new List<Item> (await itemTable.OrderBy(a =>a.ItemID).ToListAsync());

    }

}

如果有关系,以下是我的页面代码:

public partial class ItemsListXaml : ContentPage
{
    IMobileServiceTable<Item> itemTable;
    ItemsManager itemManager;

    public ItemsListXaml ()
    {

        InitializeComponent ();
        itemTable = App.client.GetTable<Item>(); 
        itemManager = new ItemsManager(itemTable);

        App.SetItemsManager (itemManager);
    }

    protected async override void OnAppearing ()
    {
        base.OnAppearing ();
        listView.ItemsSource = await itemManager.GetTasksAsync ();
    }

    async void  OnValueChanged (object sender, TextChangedEventArgs e) {
        var t = e.NewTextValue;
        // perform search on min 3 keypress
        if (t.Length>3) {
            listView.ItemsSource = await itemManager.GetTasksAsync(SearchFor.Text);
        }
    }
}

看起来问题行是这样的:

var list = new List (await 
    itemTable.Where(x => x.ItemID.Contains searchString)).ToListAsync());

不确定那里到底发生了什么,但我确实设法让类似的东西起作用。我的示例使用代理对象来保存 Azure 提取。我获取一次以获取初始任务列表并将其保存到我可以绑定到列表的本地 ObservableCollection 对象。然后,我可以过滤绑定到列表的集合对象(示例 here)。

你可能有正当理由从 Azure 中获取筛选列表。在我看来 - 请耐心等待,因为我不是应用程序设计方面的专家 - 除非在列表的初始获取和过滤器操作之间有很长一段时间,其中可能有新数据引入 table,似乎只过滤一个本地对象会表现得更好而且更便宜。该应用程序可以随时处理推送通知以根据需要更新列表。

基本上,将对象从 Azure 拉入其中,如下所示:

public async Task<ObservableCollection<ToDoItem>> GetTasksAsync()
{
    try
    {
        return new ObservableCollection<ToDoItem>(await _todoTable.ReadAsync());
    }
    catch (MobileServiceInvalidOperationException msioe)
    {
        Debug.WriteLine(@"INVALID {0}", msioe.Message);
    }
    catch (Exception e)
    {
        Debug.WriteLine(@"ERROR {0}", e.Message);
    }
    return null;
}

然后,绑定到列表,如下所示:

protected async override void OnAppearing()
{
    base.OnAppearing();

    App.TodoManager.TodoViewModel.TodoItems = await App.TodoManager.GetTasksAsync();

    listViewTasks.ItemsSource = App.TodoManager.TodoViewModel.TodoItems;
}

在此示例中,“App.TodoManager.TodoViewModel.TodoItems”是代理对象(即 ObservableCollection)的完全限定路径。

然后您可以过滤代理对象并将其重新绑定到列表中。我实际上并没有在示例中实现该部分,但我确实记下了它的一个副本,然后添加了代码,看起来工作正常。这将是代码:

获取筛选列表:

public ObservableCollection<ToDoItem> GetFilteredList(string searchString)
{
    return new ObservableCollection<ToDoItem>
    (TodoViewModel.TodoItems.Where(x => x.Name.Contains(searchString)));
}

调用辅助方法并绑定到列表视图(将其合并到您的示例块之一):

async void  OnValueChanged (object sender, TextChangedEventArgs e) {
    var t = e.NewTextValue;
    // perform search on min 3 keypress
    if (t.Length>3) {
       App.TodoManager.TodoViewModel.TodoItems = App.TodoManager.GetFilteredList(searchFor.Text);
        listViewTasks.ItemsSource = App.TodoManager.TodoViewModel.TodoItems; 
     }
}