web-dev-qa-db-fra.com

Besoin de formater les dates dans WPF DataGrid construit dynamiquement

Nous lions un ensemble de résultats inconnu à un WPG DataGrid au moment de l'exécution. Certaines de nos colonnes contiendront des valeurs DateTime et nous devons formater correctement ces champs date-heure. Sans savoir quelles colonnes seront des champs DateTime au moment de la conception, comment pouvons-nous formater les colonnes lors de l'exécution?

Nous utilisons DefaultView d'un DataTable pour nous lier au WPF DataGrid.

30
FarrEver

qu'en est-il de

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

Je pense que c'est mieux que d'écrire de plus gros morceaux de code

47
Junior M

J'ai compris comment le faire dans le code ... j'espère qu'il existe un moyen d'imiter cela en XAML. (Veuillez poster si vous trouvez un échantillon XAML fonctionnel.)

Pour ce faire dans le code, ajoutez un gestionnaire d'événements pour l'événement AutoGeneratingColumn de la grille, tel que:

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}";
        }
    }
}
31
FarrEver

Hé, vous pouvez définir les informations de culture locale dans le constructeur du formulaire WPF comme

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

O vous pouvez inclure le balisage xml xml: lang = "en-GB" dans le balisage de l'en-tête de la fenêtre

18
Libi James
<DataGridTextColumn Header="Last update"
    Width="110"
    IsReadOnly="True"
    Binding="{Binding Path=Contact.TimeUpdate, StringFormat={}\{0:dd/MM/yyyy hh:mm\}, Mode=OneWay}" />
8
MAXE

J'utiliserais un DataTemplate avec un DataType de Date ou DateTime (selon lequel il apparaîtra comme). Placez un TextBlock dans le DataTemplate avec un StringFormat dans la liaison.

Quelque chose comme ça devrait fonctionner (non testé)

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

Ou si vous voulez qu'il s'applique uniquement dans la grille

<wpfToolkit:DataGrid>
    <wpfToolkit:DataGrid.Resources>
        <DataTemplate DataType="{x:Type DateTime}">
            <TextBlock Text="{Binding StringFormat={0:d}}"  />
        </DataTemplate>
    </wpfToolkit:DataGrid.Resources>
    ...
</wpfToolkit:DataGrid>
7
Bryan Anderson

dataGridTextColumn.Binding.StringFormat = "{0: jj/MM/aaaa}";

a travaillé magnifiquement

3
Web Developer

je cours de cette façon. son travail terminé.

<TextBlock  Text="{Binding Date_start,  StringFormat=\{0:dd-MM-yyyy\}, Mode=OneWay}" />
2
Rashed DIP

La réponse de FarrEver, le 11 mai est bonne, mais selon moi, cela ne fonctionne pas. je reçois toujours mm/jj/aaa américain à la place de mon jj/mm/aaaa allemand Je propose donc de trouver les paramètres régionaux de l'ordinateur et de l'utiliser dans 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

voir aussi: mon blog

0
Aleksander