Ich baue eine Windows Phone 10-Anwendung mit Universal Windows Platform. In meiner App habe ich eine Standard-Kalenderansicht, die Dichtewerte für Termine mit Ereignissen anzeigen möchte. Die Idee ist, den Kalender zu laden, sobald die Seite geladen ist, eine API-Anfrage zu machen, und nach erfolgreichem Datenabruf das CalendarView seine Benutzeroberfläche aktualisieren, so dass das CalendarViewDayItemChanging
Ereignis aufgerufen wird. Von dort kann ich meine Dichte Farben für die Zellen, die Ereignisse haben.UWP CalendarView Update auf Befehl
Ich habe so ziemlich alles funktioniert richtig bis auf einen Teil. Wenn der Kalender zum ersten Mal geladen wird, setze ich die Min/Max-Datumsbereiche auf den aktuellen Monat, sodass nur jeweils ein Monat angezeigt wird. Dadurch wird die Benutzeroberfläche des Kalenders wie erwartet aktualisiert. Nachdem jedoch meine API-Anforderung abgeschlossen ist, wenn ich versuche, die Min/Max-Datumsbereiche erneut auf dieselben Daten festzulegen, aktualisiert der Kalender seine Benutzeroberfläche nicht. Aus diesem Grund kann ich CalendarView nicht zwingen, seine Benutzeroberfläche zu aktualisieren.
Ich habe versucht, UpdateLayout aufzurufen, habe versucht, die Min/Max-Datumsbereiche zurückzusetzen, und ich habe versucht, den DataContext des Kalenders an eine ObservableCollection in meinem Code zu binden, der aktualisiert wird, wenn meine Daten aktualisiert werden. Nichts davon funktioniert und ich sehe keine Methode, um nur die Benutzeroberfläche zu aktualisieren.
Ich bin ziemlich neu in UWP, bin also unsicher, was ich falsch mache. Ich weiß, dass das Konzept der Datenbindung ein großer Teil von UWP ist, aber ich bin mir nicht sicher, wie ich meine Daten an diese Kalenderansicht binden würde, damit sie aktualisiert wird, wenn meine Daten aktualisiert werden. Irgendwelche Vorschläge?
Unten finden Sie einen kurzen Auszug meines Codes, wie er jetzt steht.
XAML
<CalendarView
Name="Calendar"
NumberOfWeeksInView="6"
CalendarViewDayItemChanging="CalendarView_DayItemChanging"
DataContext="{Binding CalendarDates}">
</CalendarView>
-Code-behind
namespace Pages
{
public sealed partial class CalendarPage : BasePage
{
#region Private Variables
private CalendarPageModel PageModel = new CalendarPageModel();
private ObservableCollection<DateTime> CalendarDates;
#endregion
#region Constructor
public CalendarPage()
{
this.InitializeComponent();
CalendarDates = new ObservableCollection<DateTime>();
}
#endregion
#region Events
private void Page_Loaded(object sender, RoutedEventArgs args)
{
SetCalendarDateRange(); //NOTE: This is done here so that my UI consistantly shows the correct dates on the screen
LoadData();
}
private void CalendarView_DayItemChanging(CalendarView sender, CalendarViewDayItemChangingEventArgs args)
{
if (!PageModel.DateHasEvent(args.Item.Date))
{
args.Item.SetDensityColors(null);
}
else
{
List<Color> colors = new List<Color>();
Color? color = Application.Current.Resources["CalendarHasEventDensityColor"] as Color?;
if (color != null)
{
colors.Add((Color)color);
}
args.Item.SetDensityColors(colors);
}
}
#endregion
#region Data
private void SetCalendarDateRange()
{
Calendar.MinDate = PageModel.StartDate;
Calendar.MaxDate = PageModel.EndDate;
}
private async void LoadData()
{
// get data
await PageModel.RefreshData(PageModel.StartDate, PageModel.EndDate);
// force calendar to update
//NOTE: This only works if the date range is actually different than what it's currently set to
SetCalendarDateRange();
//NOTE: I have tried to just manually add a date to my observable collection to see if it'll kick off the calendar refresh, but it doesn't
CalendarDates.add(DateTime.Now);
}
#endregion
}
}
Es ist definitiv möglich, den Kalender die Benutzeroberfläche aktualisieren, wenn Sie die MinDate und MaxDate ändern, aber Sie haben keine vollständige Repro (wo ist "CalendarPageModel"?) So kann nicht sehen, wo das Problem in Ihrem Code ist. Was passiert in 'RefreshData'? Was nennt man noch 'LoadData'? –
Nichts davon sollte von Bedeutung sein. Es ist abstrahiert, da die einzige Frage, die ich habe, ist, wie ich den Kalender aktualisieren kann, ohne die Min/Max-Daten zu ändern. Sie können einfach davon ausgehen, dass die Aufrufe loadData und refreshData Daten abrufen und die Daten in der CalendarPageModel-Klasse speichern. Momentan sind diese Daten nicht mit dem CalendarView verbunden. Ich könnte diesen Code entfernen, wenn Sie möchten. Wie auch immer, die Frage ist, wie Sie das CalendarView auffrischen, was bedeutet, den Mentor anzurufen, den ich oben skizziert habe, ohne die Min/Max-Daten zu ändern? –
Sorry für die Ruppes übrigens. Tippen Sie das an einem Telefon ein. –