Laden...

2D ObservableCollection an DataGrid binden

Erstellt von Wasined vor 3 Jahren Letzter Beitrag vor 3 Jahren 359 Views
W
Wasined Themenstarter:in
13 Beiträge seit 2020
vor 3 Jahren
2D ObservableCollection an DataGrid binden

Hallo in die Runde!

Ich möchte eine csv Datei einlesen und in ein Datagrid ausgeben.
Da ich nicht weiß wie viele Zeilen und Spalten die CSV Datei hat mache ich das Einlesen über eine 2 dimensionale ObservableCollection.

Die sehen grundsätzlich so aus:


        public ObservableCollection<ObservableCollection<string>> ImportGrid
        {
            get { return _ImportGrid; }
            set { _ImportGrid = value; OnPropertyChanged(nameof(ImportGrid)); }
        }
        private ObservableCollection<ObservableCollection<string>> _ImportGrid;

        public ObservableCollection<string> ImportSpalten
        {
            get { return _ImportSpalten; }
            set { _ImportSpalten = value; OnPropertyChanged(nameof(ImportSpalten)); }
        }
        private ObservableCollection<string> _ImportSpalten;

Später kommt dann das Einlesen, das funktioniert auch. Meine 2D ObservableCollection ist also korrekt gefüllt.
Wo es krankt ist das Binden an ein DataGrid im Xaml. Das sieht so aus:


<DataGrid CanUserSortColumns="False" CanUserAddRows="False" AutoGenerateColumns="False" CanUserDeleteRows="True"
                  ItemsSource="{Binding ImportGrid}">
            <DataGrid.Columns>
                <md:DataGridTextColumn Binding="{Binding ImportSpalten[0]}"/>
                <md:DataGridTextColumn Binding="{Binding ImportSpalten[1]}"/>
                ....
            </DataGrid.Columns>
        </DataGrid>

Hierbei funktioniert das "Binding="{Binding ImportSpalten[0]}" etc. " natürlich nicht.
Ich möchte nicht einfach alle eingelesenen Spalten darstellen sondern konkret die ersten X.
Wie kann ich also die Werte der Spalten anhand ihres Index abfragen?
Oder bin ich da generell auf dem Holzweg?

Danke für Tipps 🙂

W
955 Beiträge seit 2010
vor 3 Jahren

Es gibt aber eine Möglichkeit einen Indexer im XAML zu binden. Du musst mal den Syntax in der Referenz nachschauen. Problem ist aber dass du die Anzahl der Elemente zur Compilerzeit nicht weißt. Man könnte sich daher auch von der Grid-Lösung verabschieden und mit Collections arbeiten (ItemsControl) die wiederum im ItemTemplate eine Collection aufweisen.
Eine Alternative wäre ein Converter.

W
Wasined Themenstarter:in
13 Beiträge seit 2020
vor 3 Jahren

Es gibt aber eine Möglichkeit einen Indexer im XAML zu binden

Hast Du da ein Beispiel für mich?

Problem ist aber dass du die Anzahl der Elemente zur Compilerzeit nicht weißt.

Nein, ich möchte immer die ersten 10 Einträge sehen. Wenn weniger eingelesen wurde soll es leer sein. Wenn mehr eingelesen wurde werden die Werte mit Index > 10 einfach nicht angezeigt.

W
955 Beiträge seit 2010
vor 3 Jahren

Na einfach Indexer-Syntax: StackOverflow
Ach so ich sehe jetzt dass du Schwierigkeiten mit der DataGridTextBoxColumn hast. Dann nimm eine DataGridTemplateColumn. Dort einfach eine TextBox oder TextBlock reinsetzen.

J
641 Beiträge seit 2007
vor 3 Jahren

Les die csv in eine Datatable ein und binde an diese.
Das andere wird nicht funktionieren.

cSharp Projekte : https://github.com/jogibear9988