【问题标题】:Style/Template a DataGridView For Behind-Code-Use WPF为后面的代码使用 WPF 设置样式/模板 DataGridView
【发布时间】:2014-02-24 22:21:17
【问题描述】:

我必须使用 WPF 背后的代码动态创建数据网格。我必须在我的窗口中即时添加新的 DataGrid,但我希望它们的格式相似。我无法让 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)。

现在,每次我添加一个新的、唯一的 Grid 时,MyGrid 都可能有一个完全不同的 ItemsSource。但我始终希望在网格之间保持不变的是 2 列 - 标题和值。

我的所有数据都将类似于: 字典我的数据

String 是标题,int 是值。 我希望我添加的每个网格都有一个独特的“myData”应用于它们。如果我在启动时设置 3 个不同的网格,我可以做到这一点。但问题在于动态创建多个网格。 也许客户希望 1 个堆栈面板上有 50 个不同的 DataGrid。我只想确保每个带有 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);

【问题讨论】:

  • 恕我直言,您的此类东西的文档非常...分散评论...至少可以说是荒谬的。您知道搜索WPF DataGrid 教程 获得了多少好的结果吗?如果你真的是这个意思,那么你显然看起来不是很努力。此外,您需要为您的问题提供所有 的相关详细信息,而到目前为止您还没有这样做。请至少显示数据绑定类。
  • WPF DataGrid 教程搜索的问题是结果与我想要实现的目标完全无关。可笑的是,感觉就像没看清自己一样。结果是关于在开始时定义和样式化一个预定义网格。无法使用已经存在的网格或具有样式的网格即时实例化多个网格。最重要的是,对 WPF DataGrid 样式的任何类型的搜索都会导致 WPF Datagrid 仅具有具有特定数据绑定的特定行。与我正在寻找的列定义相反。
  • 在这种情况下,数据绑定类是无关紧要的。我正在寻找有关在 XAML 或 C# 中设置网格模板样式的任何类型的资源或解释,我可以使用这些模板在代码隐藏中使用 C# 创建多个网格。有或没有数据绑定。列模板更重要。只是没有创建一些讨厌的“网格复制”功能,需要大量的格式复制,这似乎很不自然并且违背了易于使用的样式/模板应该解决的问题,我找不到任何东西。

标签: c# .net wpf user-interface


【解决方案1】:

经过数小时的搜索和挖掘,为了获得正确的语法,我决定使用预定义的数据网格,然后使用控制项。这不是我最初想要的,但我设法对其进行了调整。

事实证明,您无法使用 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);

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2010-12-30
    • 2012-09-30
    • 1970-01-01
    相关资源
    最近更新 更多