web-dev-qa-db-ja.com

動的に構築されたWPF DataGridで日付をフォーマットする必要がある

実行時に不明な結果セットをWPF DataGridにバインドしています。一部の列にはDateTime値が含まれるため、これらの日時フィールドを適切にフォーマットする必要があります。設計時にどの列がDateTimeフィールドになるかがわからない場合、実行時に列をどのようにフォーマットできますか?

DataTableのDefaultViewを使用して、WPF DataGridにバインドしています。

30
FarrEver

どうですか

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

大きなコードを書くよりも良いと思います

47
Junior M

コードでこれを行う方法を理解しました...うまくいけば、XAMLでこれを模倣する方法があります。 (動作するXAMLサンプルを見つけたら投稿してください。)

これをコードで実現するには、グリッドの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}";
        }
    }
}
31
FarrEver

WPFフォームのコンストラクターでロケールカルチャ情報を次のように設定できます。

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

Or xmlマークアップを含めることができますxml:lang = "en-GB"ウィンドウヘッダーマークアップに含めることができます

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

私は、DataTypeがDateまたはDateTimeのDataTemplateを使用します(どちらに到達するかによって異なります)。バインディングでStringFormatを使用して、TextBlockをDataTemplateに配置します。

このようなものは動作するはずです(テストされていません)

<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>
7
Bryan Anderson

dataGridTextColumn.Binding.StringFormat = "{0:dd/MM/yyyy}";

美しく働いた

3
Web Developer

私はこのように実行します。その仕事は完了しました。

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

5月11日のFarrEverの答えは良いですが、私には機能しません。私はまだドイツ語のdd/mm/yyyyの代わりにアメリカのmm/dd/yyyを取得します。コンピューターの地域設定を見つけて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

参照: 私のブログ

0
Aleksander