效果图
UI页面
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid x:Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="False"
IsReadOnly="False">
<DataGrid.Columns>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
后台代码
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication2
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private DataTable data = new DataTable();
/// <summary>
/// 构造方法
/// </summary>
public MainWindow()
{
InitializeComponent();
this.InitDataGrid();
this.InitData();
}
/// <summary>
/// 初始化DataGrid
/// </summary>
private void InitDataGrid()
{
DataGridTextColumn dgtx = new DataGridTextColumn();
dgtx.Header = "第一列";
Binding bindingF = new Binding("F");
dgtx.Binding = bindingF;
this.dataGrid.Columns.Add(dgtx);
this.InitCustomHeader();
}
/// <summary>
/// 初始化数据
/// </summary>
private void InitData()
{
data.Columns.Add("F");
data.Columns.Add("A");
data.Columns.Add("B");
data.Columns.Add("C");
var dr = data.NewRow();
dr[0] = "测试1";
dr[1] = "测试2";
dr[2] = "测试3";
dr[3] = "测试4";
var dr1 = data.NewRow();
dr1[0] = "测试1";
dr1[1] = "测试2";
dr1[2] = "测试3";
dr1[3] = "测试4";
data.Rows.Add(dr);
data.Rows.Add(dr1);
this.dataGrid.ItemsSource = data.DefaultView;
}
/// <summary>
/// 设置标题
/// </summary>
private void InitCustomHeader()
{
DataTemplate dataTemplate = new DataTemplate();
FrameworkElementFactory cfef = new FrameworkElementFactory(typeof(StackPanel));
FrameworkElementFactory level1FEF = new FrameworkElementFactory(typeof(Label));
level1FEF.SetValue(Label.ContentProperty, "二大列");
level1FEF.SetValue(Label.BorderThicknessProperty, new Thickness(0, 0, 0, 0));
level1FEF.SetValue(Label.BorderBrushProperty, new SolidColorBrush(Colors.Blue));
level1FEF.SetValue(Label.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level1FEF.SetValue(Label.WidthProperty, 300.00);
cfef.AppendChild(level1FEF);
FrameworkElementFactory level2FEF = new FrameworkElementFactory(typeof(StackPanel));
level2FEF.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
FrameworkElementFactory level21FEF = new FrameworkElementFactory(typeof(Label));
level21FEF.SetValue(Label.ContentProperty, "二一列");
level21FEF.SetValue(Label.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level21FEF.SetValue(Label.WidthProperty, 150.00);
level2FEF.AppendChild(level21FEF);
FrameworkElementFactory level22FEF = new FrameworkElementFactory(typeof(Label));
level22FEF.SetValue(Label.ContentProperty, "二二列");
level22FEF.SetValue(Label.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level22FEF.SetValue(Label.WidthProperty, 150.00);
level2FEF.AppendChild(level22FEF);
cfef.AppendChild(level2FEF);
FrameworkElementFactory level3FEF = new FrameworkElementFactory(typeof(StackPanel));
level3FEF.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
FrameworkElementFactory level31FEF = new FrameworkElementFactory(typeof(Label));
level31FEF.SetValue(Label.ContentProperty, "三一");
level31FEF.SetValue(Label.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level31FEF.SetValue(Label.WidthProperty, 75.00);
level3FEF.AppendChild(level31FEF);
FrameworkElementFactory level32FEF = new FrameworkElementFactory(typeof(Label));
level32FEF.SetValue(Label.ContentProperty, "三二");
level32FEF.SetValue(Label.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level32FEF.SetValue(Label.WidthProperty, 75.00);
level3FEF.AppendChild(level32FEF);
FrameworkElementFactory level33FEF = new FrameworkElementFactory(typeof(Label));
level33FEF.SetValue(Label.ContentProperty, "三三");
level33FEF.SetValue(Label.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level33FEF.SetValue(Label.WidthProperty, 150.00);
level3FEF.AppendChild(level33FEF);
cfef.AppendChild(level3FEF);
dataTemplate.VisualTree = cfef;
DataGridTemplateColumn dgtc = new DataGridTemplateColumn();
dgtc.HeaderTemplate = dataTemplate;
this.InitCustomCell(ref dgtc);
this.InitCustomEditCell(ref dgtc);
this.dataGrid.Columns.Add(dgtc);
}
/// <summary>
/// 设置显示单元格
/// </summary>
/// <param name="dgtc"></param>
private void InitCustomCell(ref DataGridTemplateColumn dgtc)
{
DataTemplate dataTemplate = new DataTemplate();
FrameworkElementFactory cfef = new FrameworkElementFactory(typeof(StackPanel));
FrameworkElementFactory level3FEF = new FrameworkElementFactory(typeof(StackPanel));
level3FEF.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
Binding bindingLevel31 = new Binding("A");
FrameworkElementFactory level31FEF = new FrameworkElementFactory(typeof(Label));
level31FEF.SetValue(Label.ContentProperty, bindingLevel31);
level31FEF.SetValue(Label.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level31FEF.SetValue(Label.WidthProperty, 75.00);
level3FEF.AppendChild(level31FEF);
Binding bindingLevel32 = new Binding("B");
FrameworkElementFactory level32FEF = new FrameworkElementFactory(typeof(Label));
level32FEF.SetValue(Label.ContentProperty, bindingLevel32);
level32FEF.SetValue(Label.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level32FEF.SetValue(Label.WidthProperty, 75.00);
level3FEF.AppendChild(level32FEF);
Binding bindingLevel33 = new Binding("C");
FrameworkElementFactory level33FEF = new FrameworkElementFactory(typeof(Label));
level33FEF.SetValue(Label.ContentProperty, bindingLevel33);
level33FEF.SetValue(Label.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level33FEF.SetValue(Label.WidthProperty, 150.00);
level3FEF.AppendChild(level33FEF);
cfef.AppendChild(level3FEF);
dataTemplate.VisualTree = cfef;
dgtc.CellTemplate = dataTemplate;
}
/// <summary>
/// 设置编辑单元格
/// </summary>
/// <param name="dgtc"></param>
private void InitCustomEditCell(ref DataGridTemplateColumn dgtc)
{
DataTemplate dataTemplate = new DataTemplate();
FrameworkElementFactory cfef = new FrameworkElementFactory(typeof(StackPanel));
FrameworkElementFactory level3FEF = new FrameworkElementFactory(typeof(StackPanel));
level3FEF.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
Binding bindingLevel31 = new Binding("A");
FrameworkElementFactory level31FEF = new FrameworkElementFactory(typeof(TextBox));
level31FEF.SetValue(TextBox.TextProperty, bindingLevel31);
level31FEF.SetValue(TextBox.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level31FEF.SetValue(TextBox.WidthProperty, 75.00);
level3FEF.AppendChild(level31FEF);
Binding bindingLevel32 = new Binding("B");
FrameworkElementFactory level32FEF = new FrameworkElementFactory(typeof(TextBox));
level32FEF.SetValue(TextBox.TextProperty, bindingLevel32);
level32FEF.SetValue(TextBox.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level32FEF.SetValue(TextBox.WidthProperty, 75.00);
level3FEF.AppendChild(level32FEF);
Binding bindingLevel33 = new Binding("C");
FrameworkElementFactory level33FEF = new FrameworkElementFactory(typeof(TextBox));
level33FEF.SetValue(TextBox.TextProperty, bindingLevel33);
level33FEF.SetValue(TextBox.HorizontalContentAlignmentProperty, HorizontalAlignment.Center);
level33FEF.SetValue(TextBox.WidthProperty, 150.00);
level3FEF.AppendChild(level33FEF);
cfef.AppendChild(level3FEF);
dataTemplate.VisualTree = cfef;
dgtc.CellEditingTemplate = dataTemplate;
}
}
}
后台动态添加控件可参考我其他文章
WPF 后台代码动态向DataGrid添加TextBox、Combox并设置datatrigger_我的C++入门了的博客-优快云博客