如果格式不正確,首次發佈格式時抱歉。根據日期過濾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;
}
}
任何幫助將不勝感激。
「有麻煩」 - 你能更具體?你是否得到錯誤或例外?它行爲奇怪,還是崩潰?我沒有看到代碼中的任何邏輯甚至試圖進行日期過濾? – Jason
我不確定如何使用約會頁面中'vm.SelectedDates'中給出的日期過濾ObservableCollection。我已經嘗試了其他堆棧溢出問題中給出的幾個方法,但沒有成功。 –