我已经在stackoverflow中搜索了一个解决方案并发现了这个:
Need to format dates in dynamically built WPF DataGrid
我的问题是,我从SQL-Server-Database中加载了一些数据,并希望在DataGrid中的WPF应用程序中显示它们。这非常有效。 我唯一要改变的是日期列的格式为“DD / MM / YYYY HH:MM:SS”,我希望有“DD.MM.YYYY”。 好的,然后我看了下面的链接并在我的程序中尝试了这个:
<Grid Width="648" Height="263">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="172*" />
<ColumnDefinition Width="90*" />
<ColumnDefinition Width="386*" />
</Grid.ColumnDefinitions>
<DataGrid Name="dgBuchung" Height="213" HorizontalAlignment="Left" Margin="30,16,0,0" VerticalAlignment="Top" Width="595" AutoGenerateColumns="True" ItemsSource="{Binding}" Grid.ColumnSpan="3" Foreground="Black" BorderBrush="#FF688CAF" Opacity="1" Background="White" BorderThickness="1" >
<!-- <ab:DataGridTextColumn Header="Fecha Entrada" Width="110"
Binding="{Binding date, StringFormat={}{0:dd/MM/yyyy}}" IsReadOnly="True" />
-->
</DataGrid>
</Grid>
out注释部分是我的解决方案,但它会抛出XMLParseException。 首先,使用AutoGenerateColumns时这种解决方案是否可行? 如果不是,我怎么能尝试处理这个? 如果是,上面的代码有什么问题?
修改 我的问题没有解决,因为我决定不重建我的应用程序,没有AutoGenerateColumns = true的解决方案吗?
答案 0 :(得分:97)
不要忘记使用DataGrid.Columns,所有列都必须在该集合中。 在我的项目中,我的日期格式有点不同:
<tk:DataGrid>
<tk:DataGrid.Columns>
<tk:DataGridTextColumn Binding="{Binding StartDate, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" />
</tk:DataGrid.Columns>
</tk:DataGrid>
使用AutoGenerateColumns,您无法控制格式,因为DataGird会添加自己的列。
答案 1 :(得分:72)
这里的聚会很晚,但万一其他人偶然发现了这个页面......
您可以通过在XAML中设置AutoGeneratingColumn处理程序来完成此操作:
<DataGrid AutoGeneratingColumn="OnAutoGeneratingColumn" ..etc.. />
然后在代码后面做这样的事情:
private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyType == typeof(System.DateTime))
(e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";
}
答案 2 :(得分:14)
如果您的绑定属性是DateTime,那么您只需要
Binding={Property, StringFormat=d}
答案 3 :(得分:3)
Binding="{Binding YourColumn ,StringFormat='yyyy-MM-dd'}"
答案 4 :(得分:0)
我知道接受的答案很老,但有一种方法可以使用AutoGeneratColumns控制格式:
首先创建一个在生成列时将触发的函数:
<DataGrid x:Name="dataGrid" AutoGeneratedColumns="dataGrid_AutoGeneratedColumns" Margin="116,62,10,10"/>
然后检查生成的列的类型是否为DateTime,并将其String格式更改为&#34; d&#34;删除时间部分:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if(YourColumn == typeof(DateTime))
{
e.Column.ClipboardContentBinding.StringFormat = "d";
}
}
答案 5 :(得分:0)
首先选择datagrid,然后转到属性查找Datagrid_AutoGeneratingColumn并双击 然后使用此代码
Datagrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName == "Your column name")
(e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MMMMMMMMM/yyyy";
if (e.PropertyName == "Your column name")
(e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MMMMMMMMM/yyyy";
}
我尝试它适用于WPF
答案 6 :(得分:0)
这是一个非常古老的问题,但我找到了一个新的解决方案,所以我写了它。
<块引用>首先,这种方法在使用 AutoGenerateColumns 时可行吗?
是的,可以使用 AttachedProperty 完成,如下所示。
<DataGrid AutoGenerateColumns="True"
local:DataGridOperation.DateTimeFormatAutoGenerate="yy-MM-dd"
ItemsSource="{Binding}" />
定义了两个 AttachedProperty,允许您指定两种格式。
DateTimeFormatAutoGenerate
代表 DateTime
,TimeSpanFormatAutoGenerate
代表 TimeSpan
。
class DataGridOperation
{
public static string GetDateTimeFormatAutoGenerate(DependencyObject obj) => (string)obj.GetValue(DateTimeFormatAutoGenerateProperty);
public static void SetDateTimeFormatAutoGenerate(DependencyObject obj, string value) => obj.SetValue(DateTimeFormatAutoGenerateProperty, value);
public static readonly DependencyProperty DateTimeFormatAutoGenerateProperty =
DependencyProperty.RegisterAttached("DateTimeFormatAutoGenerate", typeof(string), typeof(DataGridOperation),
new PropertyMetadata(null, (d, e) => AddEventHandlerOnGenerating<DateTime>(d, e)));
public static string GetTimeSpanFormatAutoGenerate(DependencyObject obj) => (string)obj.GetValue(TimeSpanFormatAutoGenerateProperty);
public static void SetTimeSpanFormatAutoGenerate(DependencyObject obj, string value) => obj.SetValue(TimeSpanFormatAutoGenerateProperty, value);
public static readonly DependencyProperty TimeSpanFormatAutoGenerateProperty =
DependencyProperty.RegisterAttached("TimeSpanFormatAutoGenerate", typeof(string), typeof(DataGridOperation),
new PropertyMetadata(null, (d, e) => AddEventHandlerOnGenerating<TimeSpan>(d, e)));
private static void AddEventHandlerOnGenerating<T>(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is DataGrid dGrid))
return;
if ((e.NewValue is string format))
dGrid.AutoGeneratingColumn += (o, e) => AddFormat_OnGenerating<T>(e, format);
}
private static void AddFormat_OnGenerating<T>(DataGridAutoGeneratingColumnEventArgs e, string format)
{
if (e.PropertyType == typeof(T))
(e.Column as DataGridTextColumn).Binding.StringFormat = format;
}
}
<Window
x:Class="DataGridAutogenerateCustom.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataGridAutogenerateCustom"
Width="400" Height="250">
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<StackPanel>
<TextBlock Text="DEFAULT FORMAT" />
<DataGrid ItemsSource="{Binding Dates}" />
<TextBlock Margin="0,30,0,0" Text="CUSTOM FORMAT" />
<DataGrid
local:DataGridOperation.DateTimeFormatAutoGenerate="yy-MM-dd"
local:DataGridOperation.TimeSpanFormatAutoGenerate="dd\-hh\-mm\-ss"
ItemsSource="{Binding Dates}" />
</StackPanel>
</Window>
public class MainWindowViewModel
{
public DatePairs[] Dates { get; } = new DatePairs[]
{
new (){StartDate= new (2011,1,1), EndDate= new (2011,2,1) },
new (){StartDate= new (2020,1,1), EndDate= new (2021,1,1) },
};
}
public class DatePairs
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public TimeSpan Span => EndDate - StartDate;
}