2017-04-21 96 views
0

如果格式不正確,首次發佈格式時抱歉。根據日期過濾ObservableCollection Xamarin表格

我無法過濾基於給定日期的可觀察集合。應用程序將有一個日曆,用戶可以點擊日期,並在下方顯示該日期的約會。

有兩個類,一個是將從Azure獲取數據的dataManager,另一個是預約頁面本身。

這裏是appointmentPage類:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Input; 
using Xamarin.Forms; 
using Xamarin.Forms.Xaml; 
using XamForms.Controls; 

namespace TodoAzure 
{ 
    [XamlCompilation(XamlCompilationOptions.Compile)] 
    public partial class AppointmentPage : ContentPage 
    { 
     TodoItemManager manager; 
     CalendarVM vm = new CalendarVM(); 
     public AppointmentPage() 
     { 
      InitializeComponent(); 
      manager = TodoItemManager.DefaultManager; 
      calendar.DateClicked += (sender, e) => 
      { 
       System.Diagnostics.Debug.WriteLine(calendar.SelectedDates); 
      }; 
      calendar.SetBinding(Calendar.DateCommandProperty, nameof(vm.DateChosen)); 
      calendar.SetBinding(Calendar.SelectedDateProperty, nameof(vm.DateSelected)); 
      calendar.BindingContext = vm; 
     } 
     protected override async void OnAppearing() 
     { 
      base.OnAppearing(); 
      // Set syncItems to true in order to synchronize the data on startup when running in offline mode 
      await RefreshItems(true, syncItems: false); 
     } 
     //PULL TO REFRESH 
     public async void OnRefresh(object sender, EventArgs e) 
     { 
      var list = (ListView)sender; 
      Exception error = null; 
      try 
      { 
       await RefreshItems(false, true); 
      } 
      catch (Exception ex) 
      { 
       error = ex; 
      } 
      finally 
      { 
       list.EndRefresh(); 
      } 
      if (error != null) 
      { 
       await DisplayAlert("Refresh Error", "Couldn't refresh data (" + error.Message + ")", "OK"); 
      } 
     } 
     public async void OnSyncItems(object sender, EventArgs e) 
     { 
      await RefreshItems(true, true); 
     } 
     private async Task RefreshItems(bool showActivityIndicator, bool syncItems) 
     { 
      using (var scope = new ActivityIndicatorScope(syncIndicator, showActivityIndicator)) 
     { 
      appointmentPage.ItemsSource = await manager.GetAppointmentItemsAsync(syncItems);  
     } 
    } 
    private class ActivityIndicatorScope : IDisposable 
    { 
     private bool showIndicator; 
     private ActivityIndicator indicator; 
     private Task indicatorDelay; 
     public ActivityIndicatorScope(ActivityIndicator indicator, bool showIndicator) 
     { 
      this.indicator = indicator; 
      this.showIndicator = showIndicator; 
      if (showIndicator) 
      { 
       indicatorDelay = Task.Delay(2000); 
       SetIndicatorActivity(true); 
      } 
      else 
      { 
       indicatorDelay = Task.FromResult(0); 
      } 
     } 
     private void SetIndicatorActivity(bool isActive) 
     { 
      this.indicator.IsVisible = isActive; 
      this.indicator.IsRunning = isActive; 
     } 
     public void Dispose() 
     { 
      if (showIndicator) 
      { 
       indicatorDelay.ContinueWith(t => SetIndicatorActivity(false), TaskScheduler.FromCurrentSynchronizationContext()); 
      } 
     } 
    } 
} 

這裏是數據管理器類:

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Microsoft.WindowsAzure.MobileServices; 
using Microsoft.WindowsAzure.MobileServices.Sync; 
#if OFFLINE_SYNC_ENABLED 
using Microsoft.WindowsAzure.MobileServices.SQLiteStore; 
using Microsoft.WindowsAzure.MobileServices.Sync; 
#endif 

namespace TodoAzure 
{ 
    public partial class TodoItemManager 
    { 
     static TodoItemManager defaultInstance = new TodoItemManager(); 
     MobileServiceClient client; 
     IMobileServiceTable<TodoItem> todoTable; 
     IMobileServiceTable<AppointmentItem> appointmentTable; 
     private TodoItemManager() 
     { 
      this.client = new MobileServiceClient (
       Constants.ApplicationURL); 
      this.todoTable = client.GetTable<TodoItem>(); 
      this.appointmentTable = client.GetTable<AppointmentItem>(); 
     } 
     public static TodoItemManager DefaultManager 
     { 
      get { return defaultInstance; } 
      private set { defaultInstance = value; } 
     } 
     public MobileServiceClient CurrentClient 
     { 
      get { return client; } 
     } 
     public bool IsOfflineEnabled 
     { 
      get { return appointmentTable is Microsoft.WindowsAzure.MobileServices.Sync.IMobileServiceSyncTable<AppointmentItem>;  } 
    } 
    // INSERT AND UPDATE METHODS 
    public async Task SaveTaskAsync (TodoItem item) 
    { 
     if (item.Id == null) 
      await todoTable.InsertAsync (item); 
     else 
      await todoTable.UpdateAsync (item); 
    } 
    public async Task SaveTaskAsync(AppointmentItem appointment) 
    { 
     if (appointment.Id == null) 
      await appointmentTable.InsertAsync(appointment); 
     else 
      await appointmentTable.UpdateAsync(appointment); 
    } 
    public async Task<ObservableCollection<AppointmentItem>> GetAppointmentItemsAsync(bool syncItems = false) 
    { 
     try 
     { 
      IEnumerable<AppointmentItem> items = await appointmentTable 
        .ToEnumerableAsync(); 
      return new ObservableCollection<AppointmentItem>(items); 
     } 
     catch (MobileServiceInvalidOperationException msioe) 
     { 
      Debug.WriteLine(@"Invalid sync operation: {0}", msioe.Message); 
     } 
     catch (Exception e) 
     { 
      Debug.WriteLine(@"Sync error: {0}", e.Message); 
     } 
     return null; 
    } 
} 

任何幫助將不勝感激。

+0

「有麻煩」 - 你能更具體?你是否得到錯誤或例外?它行爲奇怪,還是崩潰?我沒有看到代碼中的任何邏輯甚至試圖進行日期過濾? – Jason

+0

我不確定如何使用約會頁面中'vm.SelectedDates'中給出的日期過濾ObservableCollection。我已經嘗試了其他堆棧溢出問題中給出的幾個方法,但沒有成功。 –

回答

0

過濾一個IEnumerable按日期,試試這個

// items is ObservableCollection<AppointmentItem> 
var filtered = items.Where(x => x.Date == SelectedDate); 
+0

它沒有工作):過濾是否必須在AppointmentPage類中進行,因爲這是用戶定義SelectedDate的地方? –

+0

請參閱我的編輯 - 在我的示例中,我有班級名稱而不是實例名稱。如果它仍然不起作用,請更具體一些 - 您是否在調試器中驗證過濾的數據列表正在返回?就放置過濾器表達式而言,這取決於您。 – Jason

+0

我現在看到這個錯誤「 錯誤CS1061 \t'任務>'不包含'Where'的定義並且沒有擴展方法'Where'接受'Task >'可以找到(你是否缺少使用指令或程序集引用?)「。慢慢地,但肯定到達那裏。 –