Laden...

Databinding funktioniert nur bei manchen Properties

Erstellt von Cabur vor 4 Jahren Letzter Beitrag vor 4 Jahren 908 Views
C
Cabur Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren
Databinding funktioniert nur bei manchen Properties

Hallo zusammen,

ich habe jetzt schon alles mögliche ausprobiert, aber noch keine Lösung gefunden. Ich hoffe ihr könnt mir dabei helfen und mir den richtigen Tipp geben.

Ich lade aus einer Datenbank über eine DataTable Daten in mein Programm und weise verschiedenen Variablen die Daten zu, um diese später dynamisch per Databinding anzuzeigen. Das funktioniert aber nur bedingt. Die Variablen "SetNumber" und "SetName" werden angezeigt, die anderen Variablen nicht. Woran liegt das? Habt ihr eine Idee?

         
for (int i = 0; i < DatabaseClass.dt.Rows.Count; i++)
       {
                SetNumber = DatabaseClass.dt.Rows[i]["SetNumber"].ToString();
                SetName = DatabaseClass.dt.Rows[i]["SetName"].ToString();
                Category = DatabaseClass.dt.Rows[i]["Category"].ToString();
                SubCategory = DatabaseClass.dt.Rows[i]["SubCategory"].ToString();
                Year = Convert.ToInt32(DatabaseClass.dt.Rows[i]["SetYear"].ToString());
        } 

Hier der XAML-Code zum Anzeigen der Daten

<DataGrid x:Name="ViewListItems" AutoGenerateColumns="False" CanUserAddRows="False" AlternatingRowBackground="{DynamicResource MenuBackgroundBrush}" AlternationCount="2">
     <DataGrid.Columns>
          <DataGridTextColumn Header="Setnummer" Binding="{Binding Path=SetNumber}"/>
          <DataGridTextColumn Header="Name" Binding="{Binding Path=SetName}"/>
          <DataGridTextColumn Header="Kategorie" Binding="{Binding Path=Category}"/>
          <DataGridTextColumn Header="Unterkategorie" Binding="{Binding Path=SubCategory}"/>
          <DataGridTextColumn Header="Jahr" Binding="{Binding Path=Year}"/>
     </DataGrid.Columns>
</DataGrid>
4.938 Beiträge seit 2008
vor 4 Jahren

Hallo und willkommen,

beim DataBinding müssen es immer Eigenschaften sein, keine Klassenmember (Variablen, wie du sie nennst):


public string SetNumber { get; /* private */ set; }
// ...

Irgendwie paßt aber logisch dein Code nicht zu dem XAML.
Stehen in der DataTable denn wirklich nur die Header, oder doch eher die Daten (da du sie ja auch in einer Schleife einliest)?

Wenn du schon eine DataTable hast, so kannst du diese direkt an das DataGrid binden, s. z.B. WPF - Binding DataTable to a WPF Datagrid.

C
Cabur Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren

Danke für die schnelle Antwort,

beim DataBinding müssen es immer Eigenschaften sein, keine Klassenmember (Variablen, wie du sie nennst):

  
public string SetNumber { get; /* private */ set; }  
// ...  
  

Die Eigenschaften habe ich


public static string SetNumber { get; set; }
public static string SetName { get; set; }
public static string Category { get; set; }
public static string SubCategory { get; set; }
public static int Year { get; set; }

public static void GetItems()
{
     //Laden der Daten aus der Datenbank

     for (int i = 0; i < DatabaseClass.dt.Rows.Count; i++)
     {
           SetNumber = DatabaseClass.dt.Rows[i]["SetNumber"].ToString();
           SetName = DatabaseClass.dt.Rows[i]["SetName"].ToString();
           Category = DatabaseClass.dt.Rows[i]["Category"].ToString();
           SubCategory = DatabaseClass.dt.Rows[i]["SubCategory"].ToString();
           Year = Convert.ToInt32(DatabaseClass.dt.Rows[i]["SetYear"].ToString());
     }
}

Ich habe verschiedene Ansichten erstellt, um die Daten anzuzeigen (u.a. eine Galerieansicht); nicht nur ein Datagrid.


 <ItemsControl x:Name="ViewTileItems">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Border x:Name="Border" Margin="3,0,0,15" Width="350" Height="170">
                                        <Button x:Name="btnGalleryDataSet" Background="Transparent" BorderThickness="0" Click="BtnGalleryDataSet_Click">
                                            <StackPanel Orientation="Horizontal">
                                                <Border Width="140" Height="140" CornerRadius="5" Margin="5" HorizontalAlignment="Left">
                                                    <Border.Effect>
                                                        <DropShadowEffect ShadowDepth="1"/>
                                                    </Border.Effect>
                                                    <Border.Background>
                                                        <ImageBrush ImageSource="{Binding Path=Image}"/>
                                                    </Border.Background>
                                                </Border>
                                                <StackPanel Width="190" Margin="5,0,5,0">
                                                    <TextBlock Text="{Binding Path=SetNumber}" Style="{DynamicResource DataTextblock}" HorizontalAlignment="Left" FontWeight="Bold"/>
                                                    <TextBlock Text="{Binding Path=SetName}" Style="{DynamicResource DataTextblock}" HorizontalAlignment="Left" FontWeight="Bold"/>
                                                    <DockPanel>
                                                        <TextBlock Text="Kategorie: " Style="{DynamicResource DataTextblockDetails}" FontWeight="Bold"/>
                                                        <TextBlock Text="{Binding Path=Category}" Style="{DynamicResource DataTextblockDetails}"/>
                                                    </DockPanel>
                                                    <DockPanel>
                                                        <TextBlock Text="Unterkategorie: " Style="{DynamicResource DataTextblockDetails}" FontWeight="Bold"/>
                                                        <TextBlock Text="{Binding Path=SubCategory}" Style="{DynamicResource DataTextblockDetails}"/>
                                                    </DockPanel>
                                                    <DockPanel>
                                                        <TextBlock Text="Jahr: " Style="{DynamicResource DataTextblockDetails}" FontWeight="Bold"/>
                                                        <TextBlock Text="{Binding Path=Year}" Style="{DynamicResource DataTextblockDetails}"/>
                                                    </DockPanel>
                                                 </StackPanel>
                                            </StackPanel>
                                        </Button>
                                    </Border>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <WrapPanel/>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                        </ItemsControl>

Ich hoffe ihr versteht das. Es wird alles angezeigt, wie es soll nur nicht die Daten von "SubCategory" und "Year"

16.828 Beiträge seit 2008
vor 4 Jahren

Instanz Eigenschaften dürfen nicht static sein.

static allein sollte man nur verwenden, wenn es Sinn macht.
Hier sieht es nicht danach aus, dass es sinnvoll wäre - so ist static falsch angewandt.
Der Datenbankzugriff darf auch nicht static sein.

C# ist eine OOP Sprache; dahingehnd sind die Konzept auch aufgebaut.