実行時に、不明な結果セットをWPFDataGridにバインドしています。一部の列にはDateTime値が含まれるため、これらの日時フィールドを適切にフォーマットする必要があります。設計時にどの列がDateTimeフィールドになるかわからない場合、実行時にどのように列をフォーマットできますか?
DataTableのDefaultViewを使用して、WPFDataGridにバインドしています。
バインディングを次のようにフォーマットしStringFormat
ます。
<DataGridTextColumn Header="Fecha Entrada"
Width="110"
Binding="{Binding EnterDate, StringFormat={}\{0:dd/MM/yyyy hh:mm\}}"
IsReadOnly="True" />
コードの後ろにコードを書くよりはましだと思います
コードでこれを行う方法を理解しました...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}";
}
}
}
WPFフォームのコンストラクターでロケールカルチャ情報を次のように設定できます
this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);
または、ウィンドウ ヘッダー マークアップに xml マークアップxml:lang="en-GB"を含めることができます。
<DataGridTextColumn Header="Last update"
Width="110"
IsReadOnly="True"
Binding="{Binding Path=Contact.TimeUpdate, StringFormat={}\{0:dd/MM/yyyy hh:mm\}, Mode=OneWay}" />
私は、Date または DateTime の DataType を持つ DataTemplate を使用します (どちらを通過するかによって異なります)。バインディングに StringFormat を指定して、DataTemplate に TextBlock を配置します。
このようなものは動作するはずです(テストされていません)
<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>
FarrEver の 5 月 11 日の回答は良いですが、私には機能しません。ドイツ語の 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
参照:私のブログ