2014-10-01 42 views
0

我无法通过动态生成的列将DataTemplate应用于数据网格中的所有列。 ItemsSource绑定到VM中的DataTable属性。除了模板以外的其他东西都可以正常工作。这些都只是对概念的初步证明,所以数据是垃圾,但需要帮助进行概念验证。DataGridColumnHeader上的DataTemplate WPF C#

代码如下:

查看:

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

视图模型 - 上的负载,就目前而言,我创建一个表。显然,最终将与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); 
     } 
    } 

而结果:

enter image description here

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

我是否需要使用StaticResource做些事情才能使其发挥作用?将风格拉出网格?我不确定它为什么不起作用。

动态解决方案是强制性的。这是一个队列,将加载“什么”......也许5列,也许200.所以我不能单独定义列。

+0

我刚刚注意到在审查虽然,没有什么是column0产生,这应该是在column0数据在列1,2 1,等... – Aaron 2014-10-01 15:45:53

回答

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

完美。我早些时候尝试过,但遇到了一个错误,“内容已被设置”。我没有意识到Style标签需要进入UserControl.Resources标签。多一点研究,我想出了它应该放在哪里。它运作良好。谢谢! – Aaron 2014-10-01 17:45:15