1
votes

I have made a databinding to DataGrid with a Collection-Class in WPF. I made the following things for the Binding.

Collection-Class:

internal class ZeichnungCollection : ObservableCollection<ZeichnungInDB>
{
    public ZeichnungCollection() : base()
    {
    }
}

The Object-Class for the Collection:

 class ZeichnungInDB : ISerializable
{...//Properties and Constructors
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        this.GetObjectData(info, context);
        info.AddValue("Zeichnungsnummer", Zeichnungsnummer, typeof(string));
        info.AddValue("Index", Index, typeof(string));
        info.AddValue("Volante-Index", Volante_Index, typeof(int));
        info.AddValue("Änderung Intern", Aenderung_Int, typeof(string));
        info.AddValue("Änderung Extern", Aenderung_Ext, typeof(string));
    }
}

The Code of the Window:

 public Anzeigen()
    {
        InitializeComponent();
        zeichnungen = new ZeichnungCollection();
        dataInbox.ItemsSource = zeichnungen;
        Keyboard.Focus(dataInbox);
    }
private void btnSearch_Click(object sender, RoutedEventArgs e)
    {
        int volIndex = -1;
        if (checkAktuell.IsChecked == true && !txtZeichnungsnummer.Equals(""))
        {
            volIndex = DBZugriff.DBZugriff.getVolCountByDrawingNumber(txtZeichnungsnummer.Text);
        }
        int tagID = DBZugriff.DBZugriff.getTagIdByTag(txtTags.Text, int.Parse(txtProjektnummer.Text));
        int projektID = DBZugriff.DBZugriff.getProjectIdByProjectnumber(int.Parse(txtProjektnummer.Text));
        status = cmbStatus.Text;
        mmsSachmerkmal = cmbMMSSachmerkmal.Text;
        dokTyp = cmbDokTyp.Text;
        extension = cmbDatEnd.Text;
        zeichnungen.Clear();
        zeichnungen = DBZugriff.DBZugriff.findDrawings(projektID, txtZeichnungsnummer.Text, tagID, status, mmsSachmerkmal, dokTyp, extension, volIndex);
        CollectionViewSource.GetDefaultView(dataInbox.ItemsSource).Refresh();
        Keyboard.Focus(dataInbox);
    }

The Collection should be filled when clicking on the Searchbutton. But it shows me one empty row when I call the Page. So if the Collection is empty there should be no rows in the Datagrid, right? I don´t fill the Collection in a other place in the Window and I checked if the Collection is really empty. So I don´t get it why there is one empty row.

The xaml-Binding Code:

<DataGrid x:Name="dataInbox" Grid.Row="1" Width="654" MaxHeight="500" AutoGenerateColumns="False" ItemsSource="{Binding Source=ZeichnungCollection}" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,5">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Zeichnungsnummer" Binding="{Binding Zeichnungsnummer, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
                    <DataGridTextColumn Header="Index" Binding="{Binding Index, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
                    <DataGridTextColumn Header="Volante-Index" Binding="{Binding Volante-Index, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
                    <DataGridTextColumn Header="Änderung Intern" Binding="{Binding Änderung Intern, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
                    <DataGridTextColumn Header="Änderung Extern" Binding="{Binding Änderung Extern, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
                </DataGrid.Columns>
            </DataGrid>

The Select works. I checked that and the Collection is filled with the right objects but the DataGrid stays empty and I don´t know why. Has someone an Idea what the problem is or did I something wrong with the binding?

I have a second DataGrid in this Project on a other Page with a other Collection but with the same Structure like this and there it works fine.

1

1 Answers

1
votes

i think you create a new instance of zeichnungen in this line

zeichnungen = DBZugriff.DBZugriff.findDrawings(projektID, txtZeichnungsnummer.Text, tagID, status, mmsSachmerkmal, dokTyp, extension, volIndex);

so you better use foreach with add to fill the collection.

foreach(var item in  DBZugriff.DBZugriff.findDrawings(projektID, txtZeichnungsnummer.Text, tagID, status, mmsSachmerkmal, dokTyp, extension, volIndex))
{
  zeichnungen.Add(item);
}

or even better switch to MVVM with INotifyPropertyChanged and Bindings