根据日期Xamarin Forms过滤ObservableCollection

时间:2017-04-21 13:18:35

标签: c# azure xamarin filter observablecollection

如果格式不正确,首次发布对不起格式化。

我无法根据给定的日期过滤可观察的集合。该应用程序将有一个日历,用户可以在其中单击日期,下面将显示该日期的约会。

有两个类,一个是将从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;
    }
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

按日期过滤IEnumerable,试试这个

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