Jak wyeksportować zawartość DataGrid do pliku CSV w sposób MVVM? Moja DataGrid zawiera 55 kolumn. Wszystkie kolumny można zmienić lub ukryć.

Kolejność kolumn i widoczność są kontrolowane przez model widoku

<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}}"/>
2
LostInComputer 12 lipiec 2011, 07:58
Czy to jest standardowy DataGrid .NET 4?
 – 
cordialgerm
12 lipiec 2011, 08:03
Tak. Jest to standardowa siatka danych WPF
 – 
LostInComputer
12 lipiec 2011, 08:04
Czy widoczność i kolejność sortowania kolumn są kontrolowane w ViewModel czy w widoku?
 – 
cordialgerm
12 lipiec 2011, 08:05
Zaktualizowałem moje pytanie dotyczące Twojego pytania. Proszę tam zajrzeć. Dziękuję
 – 
LostInComputer
12 lipiec 2011, 08:09

2 odpowiedzi

Najlepsza odpowiedź

Możesz zmodyfikować rozwiązanie znalezione tutaj http://www.hanselman. com/blog/default.aspx?date=2010-02-04, aby używać tylko kolumn, które nie są ukryte i sortować kolumny w tej samej kolejności, co w modelu 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();
}
1
cordialgerm 12 lipiec 2011, 08:31
Problem w tym, że będę miał dużo zduplikowanego kodu. XAML: <DataGridTextColumn Binding="{Binding Sample.FileSize i EXPORT: writeCell(Sample.FileSize). 55 z nich. Myślę o statycznym zdefiniowaniu ścieżek powiązań, a następnie programowo wygeneruje kod XAML. Funkcja eksportu będzie również używać powiązania ścieżki
 – 
LostInComputer
12 lipiec 2011, 08:26
Nie rozumiem, jak duplikacja XAML ma coś wspólnego z logiką eksportu
 – 
cordialgerm
12 lipiec 2011, 08:35

Jeśli używasz MVVM, twój ViewModel musi zawierać wszystkie zmiany twojej siatki. Powinieneś utworzyć na przykład button i Command, gdzie Execute ciało będzie wyglądać tak:

{
     SaveMyListToCSV(parameter);
}

Parametrem powinien być Twój DataGrid lub Twoje źródło.

1
stukselbax 12 lipiec 2011, 08:16