如何在WPF DataGrid中显示波斯日期?

3
我该如何更改这段代码(或其他地方):
<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>

如何以波斯语格式显示日期? 数据库中的时间格式为时间戳。我仅想以波斯语格式“显示它”,如果可能的话,希望使用波斯历。

3个回答

1
如果您只想显示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。

1
这个解决方案对我有效:
<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 或更低版本,因为这些 Windows 不支持波斯日历,但是 Windows 10 支持。


0
对我而言,改变环境以更改DatePicker格式(如Thread.CurrentCulture)并不是一个好主意。当然,你可以创建从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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接