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

[img]https://i.sstatic.net /82Fbq70T.png[/img]

Это моя модель курса
Код: Выделить всё
using System.Collections.ObjectModel;
namespace TermTracker.CoreBusiness.Models;
public class Course
{
public int TermId { get; set; }
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public string Status { get; set; } = string.Empty;
public string Notes { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public Instructor? Instructor { get; set; } = new Instructor();
public ObservableCollection? Assessments { get; set; } = new ObservableCollection();
public ObservableCollection StartDateAlerts { get; set; } = new ObservableCollection();
public ObservableCollection EndDateAlerts { get; set; } = new ObservableCollection();
}
Код: Выделить всё
namespace TermTracker.CoreBusiness.Models;
public abstract class Alert
{
public int CourseId { get; set; }
public int Id { get; set; }
public int ReminderValue { get; set; }
public string ReminderUnit { get; set; } = string.Empty;
}
public class StartDateAlert : Alert { }
public class EndDateAlert : Alert { }
Код: Выделить всё
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using TermTracker.CoreBusiness.Models;
using TermTracker.Maui.Interfaces;
using TermTracker.Maui.Views;
using TermTracker.UseCases.UseCaseInterfaces;
namespace TermTracker.Maui.ViewModels;
public partial class CourseViewModel : ObservableObject
{
[ObservableProperty]
private Course course;
[ObservableProperty]
private ObservableCollection statuses;
[ObservableProperty]
private string selectedStatus;
[ObservableProperty]
private ObservableCollection reminderUnits;
private readonly IAddUseCase addCourseUseCase;
private readonly IViewUseCase viewCourseUseCase;
private readonly IEditUseCase editCourseUseCase;
private readonly IDeleteUseCase deleteCourseUseCase;
private readonly IAlertService alertService;
public CourseViewModel(IViewUseCase viewCourseUseCase,
IAddUseCase addCourseUseCase,
IEditUseCase editCourseUseCase,
IDeleteUseCase deleteCourseUseCase,
IAlertService alertService)
{
this.addCourseUseCase = addCourseUseCase;
this.editCourseUseCase = editCourseUseCase;
this.deleteCourseUseCase = deleteCourseUseCase;
this.viewCourseUseCase = viewCourseUseCase;
this.alertService = alertService;
Statuses = new ObservableCollection
{
"In Progress",
"Completed",
"Dropped",
"Plan to Take"
};
ReminderUnits = new ObservableCollection
{
"seconds",
"minutes",
"hours",
"days",
"weeks"
};
}
[RelayCommand]
public async Task GotoCourseAlerts(int courseId)
{
await Shell.Current.GoToAsync($"{nameof(CourseAlertPage)}");
}
[RelayCommand]
public void AddCourseStartDateAlert(int courseId)
{
int id = 0;
if (Course.StartDateAlerts.Any())
{
var maxId = Course.StartDateAlerts.Max(x => x.Id);
id = maxId + 1;
}
var newAlert = new StartDateAlert { CourseId = courseId, Id = id };
Course.StartDateAlerts.Add(newAlert);
}
[RelayCommand]
public void AddCourseEndDateAlert(int courseId)
{
int id = 1000;
if (Course.EndDateAlerts.Any())
{
var maxId = Course.EndDateAlerts.Max(x => x.Id);
id = maxId + 1;
}
var newAlert = new EndDateAlert { CourseId = courseId, Id = id };
Course.EndDateAlerts.Add(newAlert);
}
[RelayCommand]
public async Task UpdateAlertsAndScheduleNotifications()
{
foreach (var alert in Course.StartDateAlerts)
{
await UpdateAlert(alert);
await ScheduleNotification(alert);
}
foreach (var alert in Course.EndDateAlerts)
{
await UpdateAlert(alert);
await ScheduleNotification(alert);
}
}
private async Task UpdateAlert(Alert alert)
{
if (alert is StartDateAlert)
{
var existingAlert = Course.StartDateAlerts.FirstOrDefault(a => a.Id == alert.Id);
if (existingAlert != null)
{
existingAlert.ReminderValue = alert.ReminderValue;
existingAlert.ReminderUnit = alert.ReminderUnit;
}
}
else if (alert is EndDateAlert)
{
var existingAlert = Course.EndDateAlerts.FirstOrDefault(a => a.Id == alert.Id);
if (existingAlert != null)
{
existingAlert.ReminderValue = alert.ReminderValue;
existingAlert.ReminderUnit = alert.ReminderUnit;
}
}
}
Код: Выделить всё
using TermTracker.Maui.ViewModels;
namespace TermTracker.Maui.Views;
public partial class CourseAlertPage : ContentPage
{
private readonly CourseViewModel courseViewModel;
public CourseAlertPage(CourseViewModel courseViewModel)
{
InitializeComponent();
this.courseViewModel = courseViewModel;
this.BindingContext = this.courseViewModel;
}
};
Код: Выделить всё
Я установил x:DataType для представления коллекции в качестве модели оповещения о дате начала/окончания, попробовал новые курсы с разными наборами данных, изменил создание наблюдаемого экземпляра коллекции на модель курса, переработал способ обновления и т. д.
Подробнее здесь: https://stackoverflow.com/questions/786 ... with-my-al