Laden...

ObservableCollection<float> im DataGrid - "Die bidirektionale Bindung erfordert Path oder XPath"

Erstellt von NOFX vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.046 Views
N
NOFX Themenstarter:in
42 Beiträge seit 2015
vor 7 Jahren
ObservableCollection<float> im DataGrid - "Die bidirektionale Bindung erfordert Path oder XPath"

Dank der hilfreichen Tipps von ErfinderDesRades habe ich jetzt in meinem aktuellen Projekt komplett auf ObservableCollections statt Listen umgestellt. Jetzt tritt jedoch bei einer OC, die nur floats enthält das Problem auf, dass bei Änderung der Werte im DataGrid immer der oben genannte Fehler auftritt. Sowohl die verschiedenen Modes noch das Einfügen/Weglassen vom Path im Itemsource bringen eine Änderung.

Das OC als Property, aus der korrekt ausgelesen/angezeigt wird:

public ObservableCollection<float> TransStageList
        {
            get { return _TransStageList; }
        }

Diese wird initial befüllt:

_TransStageList = new ObservableCollection<float> { 800.0f, 1200.0f, 0.0f, 0.0f, 0.0f };

So sieht das im XAML aus:

                    <DataGrid Grid.Column="0" Grid.Row="4" ItemsSource="{Binding Path=TransStageList}" AutoGenerateColumns="False" Height="140" Width="Auto" Margin="5" RowBackground="White" AlternatingRowBackground="LightGray" CanUserAddRows="False" VerticalAlignment="Center" HorizontalAlignment="Center">
                        <DataGrid.CellStyle>
                            <Style TargetType="{x:Type DataGridCell}">
                                <Setter Property="HorizontalAlignment" Value="Right"/>
                            </Style>
                        </DataGrid.CellStyle>
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding Path=., StringFormat='F1'}">
                                <DataGridTextColumn.Header>
                                    <TextBlock TextWrapping="Wrap" TextAlignment="Center">Transistion<LineBreak/>Stage</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                        </DataGrid.Columns>
                    </DataGrid>

Gleicher Aufbau im DataGrid klappt mit OCs mit Objekten problemlos, nur hier bei float gibt es Probleme.

W
872 Beiträge seit 2005
vor 7 Jahren

Ein Float ist ein Struct/Werttyp, keine Klasse/Referenz - deswegen kannst Du nicht binden.

N
NOFX Themenstarter:in
42 Beiträge seit 2015
vor 7 Jahren

Das ist ja eine einfache Erklärung des Problems. 😃

Was wäre denn dann die sinnvollste Variante, das zu umgehen? Gibt es das Problem auch mit ListView oder ListBox o.ä.?

W
872 Beiträge seit 2005
vor 7 Jahren

Würde an sich immer eine eigene Klasse erstellen, da man nie weiss, ob nicht noch mehr Spalten kommen.
Wenn Du das nicht willst, dann musst Du mit object arbeiten, daß float wird dann mittels Boxing in eine Referent umgewandelt.

5.299 Beiträge seit 2008
vor 7 Jahren

Gibt es das Problem auch mit ListView oder ListBox o.ä.? Jo.
Das "Problem" ist, dass bidirektionales Binding nur an Properties funktioniert.
Bei einem Float gibts aber keine Property zum dran binden, und dann geht das Binding nur vom Viewmodel zum Control, nicht annersrum.
Also wie Weismat sagt: Statt Floats direkt in die OC tun, eine Klasse schaffen, mit (mindestens) einer float-Property.

Der frühe Apfel fängt den Wurm.