将datatemplate添加到动态创建的DataGrid时出现异常

时间:2016-01-26 07:46:16

标签: c# wpf xaml datagrid

表格代码:

C#:

           Tracker.MyFile[] fileData = tracker.GetFileData();

            DataTable fileDataTable = new DataTable();
            fileDataTable.Columns.Add("Name", typeof(string));
            fileDataTable.Columns.Add("Category", typeof(string));
            fileDataTable.Columns.Add("Length", typeof(string));

            foreach (Tracker.MyFile file in fileData)
            {
                DataRow dr = fileDataTable.NewRow();
                dr["Name"] = file.DownloadName;
                dr["Category"] = file.Category;
                dr["Length"] = FormatLength(file.Length);

                fileDataTable.Rows.Add(dr);
            }               

XAML:

                   <DataGrid Name="dgFiles" AutoGenerateColumns="True"                   IsReadOnly="True" ItemsSource="{Binding}">
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Name ="Download" Content="Download"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>                  
                </DataGrid>

异常:

  

在使用ItemsSource之前,项目集合必须为空。

现在,异常是否意味着您无法将自定义列添加到已创建的表中?如果是,是否还有其他方法可以添加自定义列?

我尝试的另一件事是通过带有C#Button类的代码向表中添加一个按钮列,但它没有在运行时呈现按钮,只显示了一个显示按钮类型的字符串。

感谢。

1 个答案:

答案 0 :(得分:3)

如果你想在DataGrid.Columns下添加一些你必须这样做的列,否则你将它添加到ItemsCollection。

               <DataGrid Name="dgFiles" AutoGenerateColumns="True"                   IsReadOnly="True" ItemsSource="{Binding}"> 
      <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Name ="Download" Content="Download"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>  
        </DataGrid.Columns>                
            </DataGrid>