我正在尝试根据数据类型(例如 Int32、float、..)更改数据绑定 DataGrid 的水平列对齐方式。
在网上搜索了我所学的一个简单示例之后,通过 xaml 的 DataTriggers 应该是正确的选择。那正确吗?如果是这样,我将如何实现触发器?
我对 WPF 很陌生,过去一直在使用 WindowsForms。根据数据类型更改列方向不是那么困难吗?任何帮助表示赞赏!
我正在尝试根据数据类型(例如 Int32、float、..)更改数据绑定 DataGrid 的水平列对齐方式。
在网上搜索了我所学的一个简单示例之后,通过 xaml 的 DataTriggers 应该是正确的选择。那正确吗?如果是这样,我将如何实现触发器?
我对 WPF 很陌生,过去一直在使用 WindowsForms。根据数据类型更改列方向不是那么困难吗?任何帮助表示赞赏!
这可能会有所帮助 -基于成员变量的不同视图/数据模板
另一种选择是使用 DataTemplate 选择器。只需查看本教程:http ://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector
您可以处理 AutoGeneratingColumn 事件。
在您的 xaml 中添加:
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True"
AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn"></DataGrid>
在代码隐藏中:
private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyType == typeof (Int32))
{
if (e.Column != null)
{
var dgct = new DataGridTemplateColumn();
var cName = e.Column.Header as string;
var b = new Binding(cName);
var sfactory = new FrameworkElementFactory(typeof(TextBlock));
sfactory.SetValue(TextBlock.TextProperty, b);
sfactory.SetValue(TextBlock.TextAlignmentProperty, TextAlignment.Right);
var cellTemplate = new DataTemplate();
cellTemplate.VisualTree = sfactory;
dgct.CellTemplate = cellTemplate;
dgct.Header = cName;
dgct.SortMemberPath = cName;
e.Column = dgct;
}
}
... *and so on for all your data types*
}
您可以查看以下链接:
http://msdn.microsoft.com/en-us/library/cc903950(v=vs.95).aspx http://mareinsula.wordpress.com/2011/06/06/tips-on-wpf-autogeneratinged-数据网格/
好的,我现在已经从后面的代码中解决了这个问题。也许有人可以给我一个提示,我如何使用 XAML 更优雅地解决这个问题?我已经在网上搜索了几个小时,以找到一个示例,这对于 WPF 新手来说并不难,只是没有找到任何能够成功实现的东西。
好的,代码如下:将 DataTable 作为 DataSource 我添加以下内容:
foreach (DataColumn cc in table.Columns)
{
Type type = cc.DataType;
Style alignStyle = new Style(typeof(Microsoft.Windows.Controls.DataGridCell));
alignStyle.Setters.Add(new Setter(Microsoft.Windows.Controls.DataGridCell.VerticalAlignmentProperty, VerticalAlignment.Center));
var column = new Microsoft.Windows.Controls.DataGridTextColumn
{
Header = cc.ColumnName,
Binding = new Binding(cc.ColumnName)
};
if(type.Name=="Int32"){
alignStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));
column.Foreground = Brushes.Red;
column.CellStyle = alignStyle;
}
else if (type.Name == "DateTime")
{
alignStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Center));
column.Foreground = Brushes.Green;
column.Binding.StringFormat = "{0:dd.MM.yyyy}";
column.CellStyle = alignStyle;
}
else if (type.Name == "String")
{
alignStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Left));
column.Foreground = Brushes.Blue;
column.CellStyle = alignStyle;
}
else if (type.Name == "Double")
{
alignStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));
column.Foreground = Brushes.Brown;
column.Binding.StringFormat = "{0:F3}";
column.CellStyle = alignStyle;
}
grids.Columns.Add(column);
}