Как мне получить значение моего выбора в представлении коллекции, чтобы оно правильно обновлялось со значением моей единAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как мне получить значение моего выбора в представлении коллекции, чтобы оно правильно обновлялось со значением моей един

Сообщение Anonymous »

Во-первых, я использую Maui, MVVM и Plugins.LocalNotifications.
Я настраиваю оповещения о датах начала и окончания курса, но у меня возникли проблемы с выбранной мной привязкой значения элемента для моих блоков оповещений.
Мое ожидаемое поведение — щелкнуть значок колокольчика на странице сведений о курсе, перейти на страницу оповещений курса и затем иметь возможность добавить оповещения о дате начала и окончания. Мне удалось заставить источник элемента средства выбора заполнять и сохранять значение напоминания при переходе на страницу оповещения и обратно, но когда я ухожу со страницы и обратно, средство выбора выбирало значение «секунды, дни, недели». и т. д. не загружается.
Вот несколько изображений, показывающих проблему.
Изображение
[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 { }

это соответствующий код для моей модели представления курса. У меня есть кнопка + в рамке оповещения о дате начала, которая добавляет новый StartDateAlert в наблюдаемую коллекцию оповещений о дате начала. Отсюда я устанавливаю источник элемента выбора с наблюдаемой коллекцией единиц напоминания. Когда я нажимаю кнопку «Сохранить», оно должно обновлять каждое оповещение данными привязки, а затем создавать локальное уведомление за период времени до даты начала или окончания в зависимости от типа оповещения.

Код: Выделить всё

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;
}
};
Вот моя страница оповещений в формате xaml У меня работают локальные уведомления, и я еще не реализовал логику удаления, но мне бы очень хотелось, чтобы привязка данных со значением средства выбора работала.
Я установил x:DataType для представления коллекции в качестве модели оповещения о дате начала/окончания, попробовал новые курсы с разными наборами данных, изменил создание наблюдаемого экземпляра коллекции на модель курса, переработал способ обновления и т. д.


Подробнее здесь: https://stackoverflow.com/questions/786 ... with-my-al
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»