C# DataGridColumnHeader WPF C上的DataTemplate#

C# DataGridColumnHeader WPF C上的DataTemplate#,c#,wpf,datagrid,datatemplate,C#,Wpf,Datagrid,Datatemplate,我很难将DataTemplate应用于datagrid中具有动态生成列的所有列。ItemsSource绑定到VM中的DataTable属性。除了模板之外,其他一切都正常工作。现在这只是概念的初步证明,所以数据是垃圾,但需要概念证明方面的帮助 代码如下: 视图: ViewModel-加载时,目前我正在创建一个表。显然最终将被DB调用所取代 [ImportingConstructor] public GenericQueueViewModel() {

我很难将DataTemplate应用于datagrid中具有动态生成列的所有列。ItemsSource绑定到VM中的DataTable属性。除了模板之外,其他一切都正常工作。现在这只是概念的初步证明,所以数据是垃圾,但需要概念证明方面的帮助

代码如下:

视图:


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);
        }
    }
[导入构造函数]
公共GenericQueueViewModel()
{           
int y=新随机数()。下一步(20);
TestList=createTableForDataGrid(y);
}
专用数据表createTableForDataGrid(int numberOfCols)
{
DataTable测试=新DataTable();
for(int i=0;i
结果是:

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

我需要使用StaticResource做些什么才能让它工作吗?将样式从网格中拉出?我不太清楚它为什么不起作用


动态解决方案是强制性的。这适用于将加载“whatever”。。。也许5列,也许200列。所以我不能单独定义列。

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

<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>


我只是在查看时注意到,第0列中没有生成任何内容,第0列中应该包含的数据位于第1列、第1列与第2列中,等等……非常完美。我之前尝试过这个,但是得到了一个错误,即“内容已经设置好了”。我没有意识到样式标记需要进入UserControl.Resources标记。再做一点研究,我就知道该把它放在哪里了。它工作得很好。非常感谢。
<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>