From fb7a015b4219a450abc1835e7c59eaf0891177e2 Mon Sep 17 00:00:00 2001 From: Baddi86 Date: Tue, 1 Sep 2026 20:09:08 +0200 Subject: [PATCH] CalendarDatePicker: DateTimeOffset<->DateTime-Konvertierung per Converter CalendarDatePicker.SelectedDate ist (WPF-Toolkit-Ursprung) DateTime?, nicht DateTimeOffset? wie beim eingebauten DatePicker - Avalonia bietet dafuer keine automatische Konvertierung. Ohne Converter blieb das Feld leer und ein Klick auf einen Kalendertag warf eine InvalidCastException. Betraf auch die schon bestehenden Bindings in WithdrawStudentDialog und CreateLetterDialog, nur bislang unbemerkt. Co-Authored-By: Claude Sonnet 5 --- .../DateTimeOffsetToDateTimeConverter.cs | 22 ++++++++++++++++ .../ClassTeacherAbsencesView.axaml | 5 ++-- .../ClassTeacherRegisterView.axaml | 5 ++-- ...ebUntisLessonAbsenceComparisonDialog.axaml | 5 ++-- .../Views/Groups/WithdrawStudentDialog.axaml | 5 ++-- .../WebUntisTimetableImportDialog.axaml | 3 ++- .../Views/Students/CreateLetterDialog.axaml | 3 ++- ...ebUntisDocumentationComparisonDialog.axaml | 5 ++-- TODO.md | 26 ++++++++++++------- 9 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 LehrerApp.Desktop/Converters/DateTimeOffsetToDateTimeConverter.cs diff --git a/LehrerApp.Desktop/Converters/DateTimeOffsetToDateTimeConverter.cs b/LehrerApp.Desktop/Converters/DateTimeOffsetToDateTimeConverter.cs new file mode 100644 index 0000000..8d546a2 --- /dev/null +++ b/LehrerApp.Desktop/Converters/DateTimeOffsetToDateTimeConverter.cs @@ -0,0 +1,22 @@ +using System; +using System.Globalization; +using Avalonia.Data.Converters; + +namespace LehrerApp.Desktop.Converters; + +/// `CalendarDatePicker.SelectedDate` ist (anders als der eingebaute `DatePicker`) vom +/// WPF-Toolkit übernommenes `DateTime?`, während Datumsfelder in dieser Codebasis durchgängig +/// `DateTimeOffset`(?) sind. Avalonia bietet dafür keine automatische Konvertierung +/// (`TypeUtilities.TryConvert`/`TryConvertImplicit` unterstützen `DateTime`↔`DateTimeOffset` +/// nicht) — ohne diesen Converter bleibt die Bindung beim Anzeigen stumm leer und wirft beim +/// Zurückschreiben eine `InvalidCastException`. +public sealed class DateTimeOffsetToDateTimeConverter : IValueConverter +{ + public static readonly DateTimeOffsetToDateTimeConverter Instance = new(); + + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) => + value is DateTimeOffset offset ? offset.DateTime : null; + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => + value is DateTime dateTime ? new DateTimeOffset(DateTime.SpecifyKind(dateTime, DateTimeKind.Local)) : null; +} diff --git a/LehrerApp.Desktop/Views/ClassTeacher/ClassTeacherAbsencesView.axaml b/LehrerApp.Desktop/Views/ClassTeacher/ClassTeacherAbsencesView.axaml index 2271a53..3e1badf 100644 --- a/LehrerApp.Desktop/Views/ClassTeacher/ClassTeacherAbsencesView.axaml +++ b/LehrerApp.Desktop/Views/ClassTeacher/ClassTeacherAbsencesView.axaml @@ -1,6 +1,7 @@ @@ -45,9 +46,9 @@ - + - + diff --git a/LehrerApp.Desktop/Views/ClassTeacher/ClassTeacherRegisterView.axaml b/LehrerApp.Desktop/Views/ClassTeacher/ClassTeacherRegisterView.axaml index aa82eea..eaaeaf5 100644 --- a/LehrerApp.Desktop/Views/ClassTeacher/ClassTeacherRegisterView.axaml +++ b/LehrerApp.Desktop/Views/ClassTeacher/ClassTeacherRegisterView.axaml @@ -2,6 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:LehrerApp.Desktop.ViewModels.ClassTeacher" xmlns:svm="clr-namespace:LehrerApp.Desktop.ViewModels.Students" + xmlns:conv="clr-namespace:LehrerApp.Desktop.Converters" x:Class="LehrerApp.Desktop.Views.ClassTeacher.ClassTeacherRegisterView" x:DataType="vm:ClassTeacherDetailsViewModel"> @@ -104,9 +105,9 @@ - + - + diff --git a/LehrerApp.Desktop/Views/Groups/WebUntisLessonAbsenceComparisonDialog.axaml b/LehrerApp.Desktop/Views/Groups/WebUntisLessonAbsenceComparisonDialog.axaml index 43ac676..a37ff06 100644 --- a/LehrerApp.Desktop/Views/Groups/WebUntisLessonAbsenceComparisonDialog.axaml +++ b/LehrerApp.Desktop/Views/Groups/WebUntisLessonAbsenceComparisonDialog.axaml @@ -1,6 +1,7 @@ - + - +