【问题标题】:Exporting DataGrid in MVVM way以 MVVM 方式导出 DataGrid
【发布时间】:2011-07-12 03:58:49
【问题描述】:

如何以 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 吗?
  • 是的。它是标准的 WPF DataGrid
  • 列的可见性和排序顺序是否在 ViewModel 或 View 中控制?
  • 我更新了关于您的问题的问题。请看那里。谢谢

标签: c# wpf xaml mvvm datagrid


【解决方案1】:

您可以修改此处找到的解决方案 http://www.hanselman.com/blog/default.aspx?date=2010-02-04 以仅使用未隐藏的列,并按照与 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:
    我不明白 XAML 复制与导出逻辑有什么关系
【解决方案2】:

如果您使用 MVVM,那么您的 ViewModel 必须包含您的 Grid 的所有更改。例如,您应该创建一个buttonCommand,其中Execute 正文将如下所示:

{
     SaveMyListToCSV(parameter);
}

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

【讨论】:

    猜你喜欢
    • 2016-09-30
    • 1970-01-01
    • 2021-03-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多