Как преобразовать Microsoft Graph dateTimeTimeZone в локальный DateTime?

В Microsoft Graph возвращаются значения datetime (например, в событиях Outlook). как экземпляр DateTimeTimeZone класс. Этот объект состоит из двух свойств ( datetime и timezone ), которые являются строками и представляют дату в формате UTC. В приложении UWP мы можем управлять отображением этих значений с помощью value converter следующим образом:

Вопрос: версия IValueConverter Интерфейс, используемый в следующем коде, взят из UWP Windows.UI .Xaml.Data пространство имен. Как мы можем добиться того же в приложении WPF?

using Microsoft.Graph;
using System;

class GraphDateTimeTimeZoneConverter : Windows.UI.Xaml.Data.IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            DateTimeTimeZone date = value as DateTimeTimeZone;

            if (date != null)
            {
                // Resolve the time zone
                var timezone = TimeZoneInfo.FindSystemTimeZoneById(date.TimeZone);
                // Parse method assumes local time, which may not be the case
                var parsedDateAsLocal = DateTimeOffset.Parse(date.DateTime);
                // Determine the offset from UTC time for the specific date
                // Making this call adjusts for DST as appropriate
                var tzOffset = timezone.GetUtcOffset(parsedDateAsLocal.DateTime);
                // Create a new DateTimeOffset with the specific offset from UTC
                var correctedDate = new DateTimeOffset(parsedDateAsLocal.DateTime, tzOffset);
                // Return the local date time string
                return correctedDate.LocalDateTime.ToString();
            }

            return string.Empty;
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }

Xaml UWP:

<Page
    x:Class="MyMSGraphProject.CalendarPage"
   ....
</Page>

<Page.Resources>
    <local:GraphDateTimeTimeZoneConverter x:Key="DateTimeTimeZoneValueConverter" />
</Page.Resources>

<Grid>
  <DataGrid x:Name="EventList" AutoGenerateColumns="False">
      <DataGrid.Columns>
         <DataGridTextColumn Header="Birth Date" Binding="{Binding BirthDate, Converter={StaticResource DateTimeTimeZoneValueConverter}}" />
      .....
      </DataGrid.Columns>
  </DataGrid>
</Grid>

Снимок отображения вышеуказанного DataGrid:

введите здесь описание изображения


person nam    schedule 31.07.2020    source источник


Ответы (1)


WPF имеет очень похожий интерфейс System.Windows.Data.IValueConverter.

В этой документации объясняется, как добавлять ссылки на библиотеки UWP из настольного приложения Windows: Вызов API среды выполнения Windows в классических приложениях.

Используя приведенное выше, вы можете создать System.Windows.Data.IValueConverter, который ссылается на тип DateTimeTimeZone и выполняет соответствующее преобразование, как это делает ваш текущий Windows.UI.Xaml.Data.IValueConverter.

person Keith Stein    schedule 01.08.2020
comment
Ваше предложение сработало (спасибо). Добавление using System.Globalization; using System.Windows.Data; к коду в моем посте выше и замена входного параметра string language на CultureInfo language сделали свое дело. - person nam; 02.08.2020