Нужно форматировать даты в динамически построенном WPF DataGrid - PullRequest
30 голосов
/ 11 мая 2009

Мы связываем неизвестный набор результатов с WPF DataGrid во время выполнения. Некоторые из наших столбцов будут содержать значения DateTime, и нам нужно правильно отформатировать эти поля даты и времени. Не зная, какие столбцы будут полями DateTime во время разработки, как мы можем отформатировать столбцы во время выполнения?

Мы используем DefaultView DataTable для привязки к WPF DataGrid.

Ответы [ 8 ]

47 голосов
/ 22 августа 2009

а как же

<wpfToolkit:DataGridTextColumn Header="Fecha Entrada" Width="110"  
                                   Binding="{Binding EnterDate,StringFormat={}\{0:dd/MM/yyyy hh:mm\}}" IsReadOnly="True" />

Я думаю, что это лучше, чем писать большие куски кода

31 голосов
/ 12 мая 2009

Я понял, как это сделать в коде ... надеюсь, есть способ имитировать это в XAML. (Пожалуйста, напишите, если вы найдете рабочий образец XAML.)

Чтобы выполнить это в коде, добавьте обработчик события для события Grid AutoGeneratingColumn, например:

private void ResultsDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyType == typeof(DateTime))
    {
        DataGridTextColumn dataGridTextColumn = e.Column as DataGridTextColumn;
        if (dataGridTextColumn != null)
        {
            dataGridTextColumn.Binding.StringFormat = "{0:d}";
        }
    }
}
18 голосов
/ 03 декабря 2009

Эй, вы можете установить информацию о культуре локали в конструкторе формы WPF как

this.Language = XmlLanguage.GetLanguage (CultureInfo.CurrentCulture.IetfLanguageTag);

Или вы можете включить разметку xml xml: lang = "en-GB" в разметку заголовка окна

8 голосов
/ 01 сентября 2011
<DataGridTextColumn Header="Last update"
    Width="110"
    IsReadOnly="True"
    Binding="{Binding Path=Contact.TimeUpdate, StringFormat={}\{0:dd/MM/yyyy hh:mm\}, Mode=OneWay}" />
7 голосов
/ 11 мая 2009

Я бы использовал DataTemplate с DataType of Date или DateTime (в зависимости от того, через что он будет проходить как). Поместите TextBlock в шаблон данных с StringFormat в привязке.

Примерно так должно работать (не проверено)

<DataTemplate DataType="{x:Type DateTime}">
    <TextBlock Text="{Binding StringFormat={0:d}}"  />
</DataTemplate>

Или, если вы хотите, чтобы он применялся только в сетке

<wpfToolkit:DataGrid>
    <wpfToolkit:DataGrid.Resources>
        <DataTemplate DataType="{x:Type DateTime}">
            <TextBlock Text="{Binding StringFormat={0:d}}"  />
        </DataTemplate>
    </wpfToolkit:DataGrid.Resources>
    ...
</wpfToolkit:DataGrid>
3 голосов
/ 10 июня 2011

dataGridTextColumn.Binding.StringFormat = "{0: дд / мм / гггг}";

работал красиво

2 голосов
/ 27 февраля 2015

Я бегу по этому пути. его работа завершена.

<TextBlock  Text="{Binding Date_start,  StringFormat=\{0:dd-MM-yyyy\}, Mode=OneWay}" />
0 голосов
/ 02 сентября 2009

Ответ FarrEver от 11 мая хороший, но, по моему мнению, он не работает. я все еще получаю американский мм / дд / ггг вместо моего немецкого дд / мм / гггг. Поэтому я предлагаю найти региональные настройки компьютера и использовать его в StringFormat

    Private Sub DGrid_AutoGeneratingColumn(ByVal sender As System.Object, ByVal e As Microsoft.Windows.Controls.DataGridAutoGeneratingColumnEventArgs)
    If e.PropertyType Is GetType(DateTime) Then
        Dim dataGridTextColumn As DataGridTextColumn = TryCast(e.Column, DataGridTextColumn)
        If dataGridTextColumn IsNot Nothing Then
            Dim ShortDatePattern As String = System.Globalization.DateTimeFormatInfo.CurrentInfo.ShortDatePattern
            dataGridTextColumn.Binding.StringFormat = "{0:" + ShortDatePattern + "}" '"{0:dd/MM/yyyy}"
        End If
    End If
End Sub

см. Также: мой блог

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