Как преобразовать Microsoft Graph dateTimeTimeZone в локальный DateTime? - PullRequest
0 голосов
/ 01 августа 2020

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

Вопрос : Интерфейс IValueConverter , используемый в следующий код взят из UWP Windows .UI.Xaml.Data Namespace. Как мы можем достичь того же в приложении 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();
        }
    }

UWP Xaml :

<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 :

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

1 Ответ

1 голос
/ 01 августа 2020

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...