Laden...

[erledigt] Binding zeigt alle Informationen einer Observeable Collection

Erstellt von Amosius vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.101 Views
A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren
[erledigt] Binding zeigt alle Informationen einer Observeable Collection

Ich habe eine Observeable Collection und setze eine Binding:

Summary.DataContext = ocMyCollection;

Meine GUI hat folgendes DataGrid:

<DataGrid Grid.Column="0" Grid.Row="0" ItemsSource="{Binding}" Name="Summary" CanUserSortColumns="True" Style="{StaticResource styleDataGrid}" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" ColumnHeaderHeight="40">
                                    <DataGrid.Columns>
                                      <DataGridTextColumn Header="Name" Binding="{Binding Path=Text}" Width="Auto" />
                                      <DataGridTextColumn Header="Tage" Binding="{Binding Path=iDurationDays}" Width="Auto" />
                                       <DataGridTextColumn Header="Stunden" Binding="{Binding Path=iDurationHours}" Width="Auto" />
                                       <DataGridTextColumn Header="Minuten" Binding="{Binding Path=iDurationMinutes}" Width="Auto" />
                                    </DataGrid.Columns>
                                </DataGrid>
  1. Das Grid zeigt mir nicht nur die 4 gebundenen Eigenschaften der Elemente sondern zusätzlich noch alle Eigenschaften die das Element besitzt. Mein Verdacht liegt auf dem ItemsSource="{Binding}" im DataGrid. Lasse ich das weg, wird nichts mehr angezeigt. Ich möchte jedoch nur die 4 Eigenschaften anzeigen lassen, nicht alle Eigenschaften.

  2. Die Scrollbar VerticalScrollBarVisibility="Visible" ist zwar sichtbar aber nicht aktiv.

  3. Neue Elemente die der Observeable Collection hinzugefügt werden, werden auch im DataGrid aktualisiert angezeigt. Lösche ich ein Element aus der Observeable Collection wird dies nicht im DataGrid entfernt.

Im Vorraus besten Dank für Hinweise.

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo Amosius,

  1. Das Grid zeigt mir nicht nur die 4 gebundenen Eigenschaften der Elemente sondern zusätzlich noch alle Eigenschaften die das Element besitzt. Mein Verdacht liegt auf dem ItemsSource="{Binding}" im DataGrid. Lasse ich das weg, wird nichts mehr angezeigt. Ich möchte jedoch nur die 4 Eigenschaften anzeigen lassen, nicht alle Eigenschaften.

AutoGenerateColumns (oder so ähnlich) ist eine Eigenschaft die angibt ob das DataGrid selbst die Spalten der Datenquelle hinzufügen soll.
Setze diese Eigenschaft auf false und das Problem ist gelöst.

  1. Die Scrollbar VerticalScrollBarVisibility="Visible" ist zwar sichtbar aber nicht aktiv.

Was verstehst du unter aktiv? Siehst du die Scrollbar kannst aber nicht scrollen?

  1. Neue Elemente die der Observeable Collection hinzugefügt werden, werden auch im DataGrid aktualisiert angezeigt. Lösche ich ein Element aus der Observeable Collection wird dies nicht im DataGrid entfernt.

Das sieht fast nach einem Fehler im Binding aus.
Versuche mal im Binding den Mode=Two, UpdateSourceTrigger=PropertyChanged zu setzen.

Gruss
Michael

A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren

Hallo Michael,

vielen Dank für deine Antworten.

zu 1) Erledigt - Stimmt 🙂

zu 2) Erledigt - Konnte mit Frage 1 behoben werden.

zu 3) Ergänzende Erläuterung: Wenn ich ein Element verändere (ausserhalb des DataGrids) dann erhält mein DataGrid automatisch ein Update und das Property wird mit dem korrekten aktuellen Wert angezeigt. Füge ich ausserhalb des DataGrids ein Element hinzu, wird dies im DataGrid mit angezeigt. Lösche ich ein Element ausserhalb des Datagrids, sehe ich das Objekt weiterhin im DataGrid.

Mit dem Binding bin ich noch nicht wackelfest.
Frage zum Binding: Mit deinem Hinweis verändere ich das Binding des DataGrids wie folgt:

<DataGrid Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=?, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Name="Summary" CanUserSortColumns="True" Style="{StaticResource styleDataGrid}" ColumnHeaderHeight="40">

Für Mode und UpdateSourceTrigger benötige ich den Path. Bislang habe ich im Path ein konkretes Property angegeben. Welche Bezeichnung wird erwartet? Am meisten Sinn würde doch der Name der Observable Collection machen, die ist aber doch kein Path?!

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

die ObservableCollection leitet normalerweise alle Änderungen (hinzufügen, löschen usw.) direkt an die GUI weiter.
Die Items in der ObservableCollection müssten selbst das INotifyPropertyChanged Interface implementeiren und das PropertyChanged Event auslösen sobald sich eine eigenschaft geändert hat.

Wenn du nur Elemente hinzufügst / löschst müsste das aber nicht nötig sein.

Mit löschen meinst du schon ein myObservableCollection.Remove(myItem) (oder RemoveAt)?
Denn das müsste so schon funktionieren

Für Mode und UpdateSourceTrigger benötige ich den Path. Bislang habe ich im Path ein konkretes Property angegeben. Welche Bezeichnung wird erwartet? Am meisten Sinn würde doch der Name der Observable Collection machen, die ist aber doch kein Path?!

Sry, das mit dem Binding ist so schon korrekt, da du ja die ObservableCollection direkt an den DataContext bindest. Deshalb ist ein {Binding} ausreichend

Gruss
Michael

A
Amosius Themenstarter:in
31 Beiträge seit 2010
vor 13 Jahren

Hallo Michael,

danke für die Denkanstösse 😃 Mit RemoveAt habe ich den Fehler finden können.

Ich schliesse das Thema. Vielen Dank an Dich!