2015-06-04 30 views
0

我在數據訪問層類中使用IMobileServiceTable並將其綁定到列表視圖。初始加載工作正常,但過濾不。它總是返回初始加載的數據。Xamarin IMobileServiceTable Not Filtering

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

是OnValueChanged功能之中觸發了嗎? –

+0

@克里斯安德森,是的,它觸發。 –

回答

1

它看起來像這個問題行是這樣的:

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

不知道到底發生了什麼事,但我確實設法得到類似的工作。我使用的示例使用代理對象來保存Azure提取。我獲取一次獲取任務的初始列表並將其保存到本地可綁定到列表的ObservableCollection對象。然後,我可以過濾綁定到列表的收集對象(示例here)。

您可能有合法的理由從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; 
} 

然後,綁定到列表如下所示:

​​

在這個例子中,「App.TodoManager.TodoViewModel。 TodoItems「是代理對象的完全限定路徑,即ObservableCollection。

然後,您可以篩選代理對象並將其重新綁定到列表中。實際上我沒有在樣本中實現該部分,但我確實取下了它的一個副本,然後添加了代碼,似乎工作正常。這將是代碼:

獲取過濾列表:

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

調用helper方法,並結合列表視圖(包含本到實例塊之一):

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