Xamarin IMobileServiceTable不过滤

时间:2015-06-04 13:43:36

标签: c# azure-mobile-services xamarin.forms xamarin-studio

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

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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

看起来问题就是:

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

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

您可能有合理的理由从Azure获取已过滤的列表。在我看来 - 并且因为我不是应用程序设计方面的专家而对我负责 - 除非在列表的初始提取和可能有新数据引入表的过滤器操作之间有相当长的一段时间,看起来像只过滤一个本地对象会更好,更便宜。应用程序始终可以处理推送通知以根据需要更新列表。

基本上,将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)));
}

调用辅助方法并绑定到listview(将其合并到一个示例块中):

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; 
     }
}