以MVVM方式导出DataGrid数据

3

如何以MVVM方式将DataGrid的内容导出为CSV文件?我的DataGrid包含55列。所有列都可以重新排序或隐藏。

列的顺序和可见性由视图模型控制。

<DataGridTextColumn Header="File Size"
                    DisplayIndex="{Binding Source={StaticResource Spy}, Path=DataContext.Columns.FileSize.Index, FallbackValue=8, Mode=TwoWay}"
                    Visibility="{Binding Source={StaticResource Spy}, Path=DataContext.Columns.FileSize.IsVisible, Converter={StaticResource VisibilityConverter}}"
                    Binding="{Binding Sample.FileSize, TargetNullValue={StaticResource NullString}}"/>

这是标准的.NET 4 DataGrid吗? - undefined
是的。这是标准的 WPF DataGrid。 - undefined
你的列的可见性和排序顺序在ViewModel还是View中控制? - undefined
我更新了关于你的问题的问题。请看那里。谢谢。 - undefined
2个回答

1
你可以修改在Scott Hanselman关于“从Linq到CSV”的博客文章中找到的解决方案,只使用未隐藏的列,并按照ViewModel中的顺序对列进行排序。
public string ToCsv(IEnumerable items)
{
    var csvBuilder = new StringBuilder();
    var properties = typeof(T).GetProperties().Where(prop => Columns[prop.Name].FileSize.IsVisible).OrderBy(prop => Column[prop.Name].FileSize.Index).ToArray();
    
    foreach (T item in items)
    {
        string line = string.Join(",",properties.Select(p => p.GetValue(item, null));
        csvBuilder.AppendLine(line);
    }
    return csvBuilder.ToString();
}

问题是我会有很多重复的代码。XAML:<DataGridTextColumn Binding="{Binding Sample.FileSize and EXPORT: writeCell(Sample.FileSize)。其中有55个这样的。我正在考虑静态定义绑定路径,然后以编程方式生成XAML。导出函数也将使用这些绑定路径。 - undefined
我不理解XAML的复制与导出逻辑有什么关系。 - undefined

1
如果您使用MVVM,则您的ViewModel必须包含Grid的所有更改。例如,您应该创建一个buttonCommand,其中Execute主体将如下所示:
{
     SaveMyListToCSV(parameter);
}

参数应该是你的DataGrid或者你的源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接