如何在C#代码中为具有特定模板的数据网格生成一列wpf
问题描述:
我有这段代码,工作良好,但我想在C#中动态更改它。任何人都可以帮助我将这个XAML代码转换为C#代码吗?如何在C#代码中为具有特定模板的数据网格生成一列wpf
注:我的C#代码页面加载设置此数据网格中的ItemSource
注:我想以后转换该列C#代码,变化的AutoGenerateColumns为true
<DataGrid x:Name="dg" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ValueA}" />
<TextBlock Text="{Binding ValueB}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
答
的AutoGenerateColumns = false:
public partial class MyPage:Page
{
public MyPage()
{
InitializeDataGrid();
Loaded += MyPage_Loaded;
// don't forget to add the _dataGrid into the page
this.Content = _dataGrid;
}
private void MyPage_Loaded(object sender, RoutedEventArgs e)
{
//_dataGrid.ItemsSource = xxx;
}
private void InitializeDataGrid()
{
// <DataGrid x:Name="dg" AutoGenerateColumns="False">
// <DataGrid.Columns>
// <DataGridTemplateColumn>
// <DataGridTemplateColumn.CellTemplate>
// <DataTemplate>
// <StackPanel Orientation="Horizontal">
// <TextBlock Text="{Binding ValueA}" />
// <TextBlock Text="{Binding ValueB}" />
// </StackPanel>
// </DataTemplate>
// </DataGridTemplateColumn.CellTemplate>
// </DataGridTemplateColumn>
// </DataGrid.Columns>
//</DataGrid>
// StackPanel and Children
var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
var textBlockFactoryA = new FrameworkElementFactory(typeof(TextBlock));
textBlockFactoryA.SetBinding(TextBlock.TextProperty, new Binding("ValueA"));
var textBlockFactoryB = new FrameworkElementFactory(typeof(TextBlock));
textBlockFactoryB.SetBinding(TextBlock.TextProperty, new Binding("ValueB"));
stackPanelFactory.AppendChild(textBlockFactoryA);
stackPanelFactory.AppendChild(textBlockFactoryB);
// DataTemplate
var dataTemplate = new DataTemplate
{
VisualTree = stackPanelFactory
};
// DataGridTemplateColumn
var templateColumn = new DataGridTemplateColumn
{
CellTemplate = dataTemplate
};
_dataGrid.Columns.Add(templateColumn);
// DataGrid
_dataGrid.Name = "gd";
_dataGrid.AutoGenerateColumns = false;
}
private readonly DataGrid _dataGrid = new DataGrid();
}
AutoGenerateColumns = true:
public partial class MyPage:Page
{
public MyPage()
{
InitializeDataGrid();
Loaded += MyPage_Loaded;
// don't forget to add the _dataGrid into the page
this.Content = _dataGrid;
}
private void MyPage_Loaded(object sender, RoutedEventArgs e)
{
//_dataGrid.ItemsSource = xxx;
}
private void InitializeDataGrid()
{
// <DataGrid x:Name="dg" AutoGenerateColumns="False">
// <DataGrid.Columns>
// <DataGridTemplateColumn>
// <DataGridTemplateColumn.CellTemplate>
// <DataTemplate>
// <StackPanel Orientation="Horizontal">
// <TextBlock Text="{Binding ValueA}" />
// <TextBlock Text="{Binding ValueB}" />
// </StackPanel>
// </DataTemplate>
// </DataGridTemplateColumn.CellTemplate>
// </DataGridTemplateColumn>
// </DataGrid.Columns>
//</DataGrid>
//// StackPanel and Children
//var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
//stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
//var textBlockFactoryA = new FrameworkElementFactory(typeof(TextBlock));
//textBlockFactoryA.SetBinding(TextBlock.TextProperty, new Binding("ValueA"));
//var textBlockFactoryB = new FrameworkElementFactory(typeof(TextBlock));
//textBlockFactoryB.SetBinding(TextBlock.TextProperty, new Binding("ValueB"));
//stackPanelFactory.AppendChild(textBlockFactoryA);
//stackPanelFactory.AppendChild(textBlockFactoryB);
// DataTemplate
var dataTemplate = new DataTemplate
{
//VisualTree = stackPanelFactory
};
// DataGridTemplateColumn
var templateColumn = new DataGridTemplateColumn
{
CellTemplate = dataTemplate
};
_dataGrid.Columns.Add(templateColumn);
// DataGrid
_dataGrid.Name = "gd";
_dataGrid.AutoGenerateColumns = true;
}
private readonly DataGrid _dataGrid = new DataGrid();
}
为什么要将其转换为C#?维护起来要困难得多,而且不会改善任何事情。你最好离开它。 –
因为我想在单元格中显示两个值,并且列数有所不同 – sadegh
为什么不将DataTemplate设置为资源? [这是一个答案,显示如何给DataGrid动态列](https://*.com/a/4379965/424129)。 –