2010-07-30 60 views
0

VS 2010,WPF项目。如何将文本框放入数据网格?

我有一个数据网格与所有单元格中的文本(数据来自自定义对象数组)。但是我无法复制(ctrl + c)任何单元格的内容。所以我想用文本框来显示每个单元格的内容。真正的问题是我不能在XAML中做到这一点,但我必须在代码中动态执行它,因为整个网格是在代码中手动构建的,所以XAML只知道有一个网格。

我以这种方式添加列 - 我发现所有与列相关的是我可以指定标题模板。如何为其构建单元模板并将该小部件设置为文本框?

  int i = 0; 

      foreach (var db_col in query.FieldNames) 
      { 
       var col = new DataGridTextColumn(); 
       col.IsReadOnly = false; 
       col.Header = db_col; 
       col.Binding = new Binding(String.Format("Visual[{0}]", i)); 
       grid.Columns.Add(col); 

       ++i; 
      } 

在此先感谢您。

已解决

感谢Marko,我终于想出了这样的解决方案。

 foreach (var db_col in query.FieldNames) 
     { 
       var template = new DataTemplate(); 
       var elemFactory = new FrameworkElementFactory(typeof(TextBox)); 
       elemFactory.SetBinding(TextBox.TextProperty, new Binding(String.Format("Visual[{0}]", i))); 
       template.VisualTree = elemFactory; 

       var col = new DataGridTemplateColumn(); 
       col.CellTemplate = template; 
       col.IsReadOnly = true; 
       col.Header = db_col; 
       grid.Columns.Add(col); 

       ++i; 
     } 

回答

1

首先,当单元格不处于编辑模式时,DataGridTextColumn使用TextBlock显示数据。这可能是你为什么不能从中复制任何东西的原因。一旦你进入编辑模式,TextBlock被替换为一个TextBox,然后你应该能够复制/粘贴,就像你通常那样。

考虑到您发布的代码没有提供您想要的功能,我只能假设您想要始终显示文本框。为此,您需要使用DataGridTemplateColumn。因此,在您的代码中,您将创建一个新的DataGridTemplateColumn,将它的CellTemplate设置为一个新的DataTemplate,其中inturn包含一个TextBox。 你应该找到一些样品用于此处一个TextBox创建一个DataTemplate: Can i create DataTemplate in code-behind?

另外请注意,如果你创建你需要重新实现(如果需要)被内置于其他数据网格列的一些行为DataGridTemplateColumn。例如,如果DataGrid设置为IsReadOnly = true,那么带有TextBox的DataGridTemplateColumn仍然是可编辑的。所以你必须将TextBox.IsReadOnly属性绑定到DataGrid.IsReadOnly属性。

+0

太棒了!谢谢。最初我遇到了为单元格设置模板的问题,因为我忘记更改列的类型。 – greenoldman 2010-08-03 11:56:39

相关问题