Как показать персидскую дату в WPF DataGrid?

Как я могу изменить этот код (или еще где-нибудь):

<DataGridTemplateColumn x:Name="timeColumn" Header="time" IsReadOnly="True">
    <DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
          <DatePicker SelectedDate="{Binding time, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/>
       </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Показывать дату в персидском формате? время в базе данных в формате Timestamp. Я хочу просто «показать это» в персидском формате и, если возможно, иметь персидский календарь.


person FarhadGh    schedule 03.08.2015    source источник


Ответы (3)


Если вы хотите показать только PersianDateTime, вы можете использовать System.Globalization.PersianCalendar в своей модели просмотра следующим образом:

    public string PersianDate
    {
        get
        {
            PersianCalendar pc = new PersianCalendar();
            DateTime thisDate = convert your Timestamp to DateTime here ...;
            return string.Format("{0}, {1}/{2}/{3} {4}:{5}:{6}",
                          pc.GetDayOfWeek(thisDate),
                          pc.GetMonth(thisDate),
                          pc.GetDayOfMonth(thisDate),
                          pc.GetYear(thisDate),
                          pc.GetHour(thisDate),
                          pc.GetMinute(thisDate),
                          pc.GetSecond(thisDate));
        }
    }

А затем в вашем Xaml:

    <DataGrid ItemsSource="{Binding YourList}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="PersianTime" Binding="{Binding PersianDate}"/>
            < Other columns ... />
        </DataGrid.Columns>
    </DataGrid>

Если вам нужен персидский календарь в формате и языке фарси, вы можете проверить эту библиотеку, еще один хороший источник - по этой ссылке из Code Project.

person Bahman_Aries    schedule 03.08.2015

Это решение сработало для меня:

<DataGrid AutoGenerateColumns="False" IsReadOnly="True">
    <DataGrid.Columns>
          <DataGridTemplateColumn Width="*" Header="سررسید">
              <DataGridTemplateColumn.CellTemplate>
                 <DataTemplate>
                    <TextBlock Text="{Binding DueDate,StringFormat=d}" Language="fa-IR"/>
              </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Примечание. это работает на windows 10, а для Windows я не тестировал, но не работал для windows 7 или ниже, потому что эти окна не поддерживали персидский календарь, но 10 поддерживали его.

person NEBEZ    schedule 19.06.2020

Как по мне, изменение среды для изменения формата DatePicker (например, Thread.CurrentCulture) - не лучшая идея. Конечно, вы можете создать Control, производный от DatePicker, и реализовать свойство зависимости, такое как Format, но это стоит слишком больших усилий. Я нашел простое и элегантное решение - привязать значение не к самому SelectedDate, а к какому-то неиспользуемому свойству (для этого я использовал свойство ToolTip) и обновлять это свойство при изменении SelectedDate. Реализация C # для односторонней привязки выглядит так:

 DatePicker datePicker = new DatePicker();
    datePicker.SetBinding(ToolTipProperty, "Date");
    datePicker.SelectedDateChanged += (s, ea) =>
        {
            DateTime? date = datePicker.SelectedDate;
            string value = date != null ? date.Value.ToString("yyyy-MM-dd") : null;
            datePicker.ToolTip = value;
        };

XAML + C # должен выглядеть так:

XAML:

<DatePicker ToolTip="{Binding Date Mode=TwoWay}"
            SelectedDateChanged="DatePicker_SelectedDateChanged"/>

C #:

private void DatePicker_SelectedDateChanged(object sender, EventArgs ea)
{
    DatePicker datePicker = (DatePicker)sender;
    DateTime? date = datePicker.SelectedDate;
    string value = date != null ? date.Value.ToString("yyyy-MM-dd") : null;
    datePicker.ToolTip = value;
}

Для двусторонней реализации обработайте событие ToolTipChanged таким же образом, чтобы обновить SelectedDate.

       </Setter>
    </Style>
</DatePicker.Resources>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
person DeshDeep Singh    schedule 03.08.2015