我必须使用WPF背后的代码动态创建数据网格。我必须动态添加新的DataGrids到我的窗口,但我希望它们的格式类似。我不能让Style工作。我需要2列:名称和值。我计划在创建数据网格时将数据网格绑定到不同的数据。
任何帮助将不胜感激。这种东西的文档很分散。
<Window.Resources>
<Style x:Name="Template" TargetType="DataGrid">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGrid">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Title" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label></Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Value" Width="*" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label></Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
编辑: 不知道怎么解释它。
所以说我的窗户上有一个堆叠面板。在这个堆栈面板上,我想随时随地添加DataGrids。我将能够做MyStackPanel.Children.add(MyGrid)。
现在,每次添加新的独特网格时,MyGrid都可以拥有完全不同的ItemsSource。但我总是想在网格之间保持相同的是2列 - 标题和价值。
我的所有数据都是这样的: 字典myData
String是标题,int是值。 我希望我添加的每个网格都有一个独特的“myData”应用于它们。如果我在启动时设置3个不同的网格,我可以做到这一点没问题。但问题在于动态创建多个网格。 也许客户在1个堆栈面板上需要50个不同的DataGrids。我只想确保每个具有Title和Value的网格的格式都相同,而不必在程序启动时在XAML中创建静态的网格数量。
所以我可以去:
DataGrid MyGrid = new DataGrid();
MyGrid.Style = MyXAMLStyle;
MyGrid.ItemsSource = MyData;
MyStackPanel.Children.Add(MyGrid);
而不是做像复制这样令人讨厌的事情,这可能很简单,只有2列,但越来越变得疯狂。而且这甚至都不起作用:
DataGrid template = new DataGrid();
DataGridColumn c = CustomStats.Columns[0];
template.Columns.Add(c);
c = CustomStats.Columns[1];
template.Columns.Add(c);
template.ItemsSource = MyData;
MyStackPanel.Children.Add(template);
答案 0 :(得分:0)
经过几个小时的搜索和挖掘,为了正确的语法,我决定使用预定义的数据网格,然后使用控制项。这不是我最初想要的,但我设法调整它的工作。
事实证明,您无法使用Setter属性自行设置列标题的样式。您必须定义网格本身并使用ControlItem,并为您的数据网格设置样式。
<Window.Resources>
<DataGrid x:Key="CustomGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" x:Shared="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Title" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=title}"></Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Value" Width="*" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=value}"></Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Window.Resources>
<Grid x:Name="GridBase">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel x:Name="Panel" HorizontalAlignment="Left" Grid.Column="0" VerticalAlignment="Top">
</StackPanel>
</Grid>
代码背后:
ContentControl t = new ContentControl();
t.Content = window.Resources["CustomGrid"];
t.DataContext = MyData;
window.Panel.Children.Add(t);