样式/模板一个DataGridView用于背后代码使用WPF

时间:2014-02-24 22:21:18

标签: c# .net wpf user-interface

我必须使用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);

1 个答案:

答案 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);