2017-04-21 91 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 >'可以找到(你是否缺少使用指令或程序集引用?)“。慢慢地,但肯定到达那里。 –