【问题标题】:DataTemplate on DataGridColumnHeader WPF C#DataGridColumnHeader WPF C# 上的 DataTemplate
【发布时间】:2014-10-01 15:40:11
【问题描述】:

我无法将 DataTemplate 应用于具有动态生成列的数据网格中的所有列。 ItemsSource 绑定到 VM 中的 DataTable 属性。除了模板之外的所有东西都工作得很好。现在这只是初步的概念证明,所以数据是垃圾,但需要概念证明方面的帮助。

代码如下:

查看:

<DataGrid AutGenerateColumns="true" ItemsSource={Binding xxx} etc...>
    <DataGrid.Columns>                
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <Button Content="ok"/>
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
            </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

ViewModel - 在加载时,我正在创建一个表。显然最终会被一个 DB 调用代替……

[ImportingConstructor]
    public GenericQueueViewModel()
    {           
        int y = new Random().Next(20);
        TestList = createTableForDataGrid(y);
    }

    private DataTable createTableForDataGrid(int numberOfCols)
    {
        DataTable test = new DataTable();
        for (int i = 0; i < numberOfCols; i++)
        {
            DataColumn oDc = new DataColumn();                
            test.Columns.Add(oDc);
        }
        Random x = new Random();
        int y = x.Next(100);
        for (int i = 0; i <= y; i++)
        {
            DataRow oRow = test.NewRow();
            for (int j = 0; j < test.Columns.Count; j++)
            {
                oRow[j] = i.ToString() + " | " + j.ToString();
            }
            test.Rows.Add(oRow);
        }
        return test;
    }

private DataTable _testList;

    public DataTable TestList
    {
        get { return _testList; }
        set 
        { 
            _testList = value;
            OnPropertyChanged(() => TestList);
        }
    }

结果:

这就像 DataGrid 最初是使用模板创建的,但是当 OnPropertyChanged 触发时,模板不会被调用。网格填充得很好,但标题中没有按钮。

我是否需要对 StaticResource 做一些事情才能让它工作?将样式拉出网格?我不太确定为什么它不起作用。

动态解决方案是强制性的。这是用于将加载“随便”的队列......可能是 5 列,可能是 200 列。所以我不能单独定义列。

【问题讨论】:

  • 我只是在查看时注意到,column0 中没有生成任何内容,并且应该在 column0 中的数据在 column1、1 in 2 等...

标签: c# wpf datagrid datatemplate


【解决方案1】:

您实际上是通过这种方式创建了一个额外的列。要解决此问题,您需要创建用于自定义列标题模板的样式并设置标题模板。如下所示:

<Style TargetType="DataGridColumnHeader">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate>
        <Button Content="Ok"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

<DataGrid AutGenerateColumns="true" ItemsSource={Binding xxx} etc...>

</DataGrid>

【讨论】:

  • 完美。我之前曾尝试过,但收到“内容已设置”的错误消息。我没有意识到 Style 标记需要进入 UserControl.Resources 标记。多一点研究,我想出了把它放在哪里。它工作得很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多