Делаем кнопку видимой после истечения текущего времени с помощью Xamarin.Формы

#xamarin #xamarin.forms

#xamarin #xamarin.forms

Вопрос:

У меня есть представление списка, в котором отображается текущее расписание лекарств пользователя. в настоящее время он сортирует список по следующей дате оплаты, и все лекарства, срок действия которых истек, перемещаются в конец списка.

Я хотел сделать так, чтобы для лекарств, срок действия которых истек по текущему времени, была видна кнопка «Завтра». Возможно ли это сделать?

В настоящее время я заполняю свой listview таким образом:

 /// <summary>
/// Gets User Medication list
/// </summary>
/// <returns>The user meds.</returns>
async public Task GetUserMedsOverdue()
{
    MedicationListOverdue.ItemsSource = null;
    UserMedTimesOverdue.Clear(); //Clears the list before calling API (prevents duplication)

    main.Children.Add(MedicationListOverdue);
    main.Children.Remove(NoMeds);

    if (!CrossConnectivity.Current.IsConnected)
    {
        main.Children.Remove(MedicationListOverdue);
        main.Children.Add(NoMeds);
        NoMeds.Text = "No Internet Connection - Please check your connection";
        NoMeds.Margin = new Thickness(35, 35, 20, 20);

        BusyIndicator.IsRunning = false;
    }

    else
    {
        BusyIndicator.IsRunning = true;
        //var usermed = await medicinemanager.CurrentClient.InvokeApiAsync<IEnumerable<usermedication>>("getusermednamejoin?userid="   Helpers.Settings.UserKey   "", System.Net.Http.HttpMethod.Get, null);

        try
        {
            var usermeddosagetimeoverdue = await medicinemanager.CurrentClient.InvokeApiAsync("getUserMedDosageTimeOverdue?userid="   Helpers.Settings.UserKey, null, HttpMethod.Get, await App.LoadAPIKeyAsync(), null);

            var responseContentoverdue = await usermeddosagetimeoverdue.Content.ReadAsStringAsync();
            var useroverdue = JsonConvert.DeserializeObject<ObservableCollection<UserMedDosagePayLoadOverdue>>(responseContentoverdue);

            //var usermeddosagetime = await medicinemanager.CurrentClient.InvokeApiAsync<IEnumerable<UserMedDosagePayLoad>>("getusermeddosagetime?userid="   Helpers.Settings.UserKey   "", HttpMethod.Get, API, System.Threading.CancellationToken.None);
            //null, System.Net.Http.HttpMethod.Get, API, System.Threading.CancellationToken.None);

            Debug.WriteLine("UserMedDosageTime"   usermeddosagetimeoverdue);

            foreach (UserMedDosagePayLoadOverdue item in useroverdue)
            {
                UserMedTimesOverdue.Add(item);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }

        FindNextDue(UserMedTimes);

        //Get the List of meds the user is on
        //UserMedList = await usermedicationmanager.getUserMedication();

        //foreach (usermedication item in usermed)
        //{
        //    if (item.IsActive != false)
        //    {
        //        UserMedList.Add(item);
        //    }
        //}

        if (UserMedTimes.Count != 0)
        {
            MedicationListOverdue.ItemsSource = UserMedTimesOverdue;
            BusyIndicator.IsRunning = false;      
        }

        else
        {
            Label MedLogo = new Label();
            MedLogo.Text = peoplewithfonticon.meds;
            MedLogo.FontFamily = "icomoon";
            MedLogo.FontSize = 80;
            MedLogo.Margin = new Thickness(30, 80, 0, 0);

            Label MedTitle = new Label();
            MedTitle.Text = "No rnMedications";
            MedTitle.FontSize = 50;
            MedTitle.FontAttributes = FontAttributes.Bold;
            MedTitle.Margin = new Thickness(30, 0, 0, 0);

            Label NoMeds = new Label();
            NoMeds.Margin = new Thickness(30, 0, 0, 0);
            main.Children.Remove(MedicationList);
            //main.Children.Remove(btnHistory);
            main.Children.Add(MedLogo);
            main.Children.Add(MedTitle);
            main.Children.Add(NoMeds);
            NoMeds.Text = "You haven't added any medications to your medication cupboard yet";
            //main.Children.Add(btnHistory);
            BusyIndicator.IsRunning = false;
        }

        MedicationListOverdue.ItemsSource = UserMedTimesOverdue;

        BusyIndicator.IsRunning = false;
    }
}
  

//Упорядочить набор раз, чтобы следующий срок всегда был первым

 TimeComparison = new List<TimeSpan>(TimeComparison.OrderBy(h => h.Hours).ThenBy(m => m.Minutes));
List<string> UserMedIDs = new List<string>();

for (int i = 0; i < TimeComparison.Count(); i  )
{
    DateTime NextDue = DateTime.Now.Add(TimeComparison[i]);
    DateTime NextDueToCompare = new DateTime(NextDue.Year, NextDue.Month, NextDue.Day, NextDue.Hour, NextDue.Minute, 0);
    string NextDueComparisonString = NextDueToCompare.ToString("HH:mm:ss");

    foreach (UserMedDosagePayLoad item in UserMedTimes)
    {
        if (item.Time == NextDueComparisonString amp;amp; !UserMedIDs.Contains(item.Usermedid))
        {
            UserMedTimesFilteredList.Add(item);
            UserMedIDs.Add(item.Usermedid);                        
        }
    }

    UserMedTimes = medtimes;
    MedicationList.ItemsSource = UserMedTimesFilteredList.OrderBy(X => NextDue);
    BusyIndicator.IsRunning = false;
}
  

Комментарии:

1. всегда старайтесь показывать только самый важный код, его сложно отфильтровать, что не важно

2. создайте свойство bool PastDue в вашей модели, а затем привяжите к нему свойство isVisible кнопки

3. Вы также можете использовать другой шаблон ListView, в зависимости от того, требуется ли лекарство или нет. Это позволяет отображать совершенно другой макет. Смотрите learn.microsoft.com/en-us/xamarin/xamarin-forms /… для получения подробной информации о шаблонах.