WPF DataGrid,从视图中获取数据表

时间:2016-02-11 21:16:19

标签: c# wpf mvvm datagrid datatable

我正在使用WPF,我有一个绑定到对象列表的DataGrid,每个属性都有一列:

<DataGrid x:Name="Docs" Margin="29,211,25,66" IsReadOnly="False" AutoGenerateColumns="False" 
              DataContext="{Binding Source={StaticResource Rutine}}" CanUserReorderColumns="False" 
              ItemsSource="{Binding Documents,Mode=TwoWay}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Document Type"  Binding="{Binding DocumentType}" />
        <DataGridTextColumn Header="Document (Name)" Binding="{Binding DocumentName}" /></DataGrid.Columns></DataGrid>


public IList<CSDoc> Documents
{
    get
    {
        return _Documents;
    }

    set
    {
        _Documents = value;
        NotifyPropertyChanged("Documents");
    }
}


public class CSDoc
{
    public string DocumentType{ get; set; }
    public string DocumentName{ get; set; }
}

我允许用户更改数据,以便以后可以将其导出到xlsx文件 但我需要一个DataTable对象来做到这一点 另一个问题是我需要Headers,因为xlsx文件稍后上传到另一个使用空格和括号进行验证的系统。
有没有办法从DataGrid用户视图创建DataTable而不循环每个单元格?
并且由于每个Header,没有对象列表也被循环...

2 个答案:

答案 0 :(得分:0)

制作lui工具CSDoc(以实现TwoWay绑定),并在ViewModel图层中处理它。

要将INotifyPropertyChanged转换为DataTable,您可以手动执行此操作(如果只有两列(更快),或使用此处概述的通用方法:Convert generic List/Enumerable to DataTable?

答案 1 :(得分:0)

我认为此帖很好地涵盖了您的问题Convert generic List/Enumerable to DataTable? 或者你可以使用迭代方式。

try
{
    var dataTable = new DataTable();

    dataTable.Columns.Add("DocumentType");
    dataTable.Columns.Add("DocumentName");

    foreach (CSDoc Myelement in Documents)
    {
        var newRow = dataTable.NewRow();

        // fill the properties into the cells
        newRow["DocumentType"] = element.DocumentType;
        newRow["DocumentName"] = element.DocumentName;

        dataTable.Rows.Add(newRow);
    }

    // export to an xlsx file
}
catch (Exception e)
{
    MessageBox.Show("error" + e.ToString());
}