C# WPF DataGrid klappt zu

Raknar

Ensign
Dabei seit
Apr. 2006
Beiträge
138
Guten Abend,

ich hänge seit ein paar Stunden an dem Problem, dass sich DataGrids zuklappen, wenn man in eine Zelle klickt, die man eigentlich bearbeiten will.
Aber erst mal eine Beschreibung der Teilfunktionalität, die ich darstellen will:
In einer TextBox gebe ich einen Suchbegriff ein -> ein (problemloses) DataGrid listet die Treffer auf. Selektiere ich einen Treffer, zeigen die übrigen (problembehafteten) DataGrids Informationen zu dem Objekt an (Kontakt: Name, Adressen, Telefonnummern,...), die aus einer Datenbank stammen. Soweit so gut. Um genau diese Informationen zu ergänzen oder zu ändern, möchte ich einfach in die entsprechende Zelle klicken können, ein Cursor erscheint und ich kann sie bearbeiten - ähnlich wie in Excel. Durch einen Klick verschwinden aber die Zeilen aller Informations-DataGrids (nur Spaltenköpfe bleiben sichtbar).

Wie könnte man das beheben? Hier ist der XAML-Ausschnitt:
Code:
<StackPanel>              
  <Label Content="Adresse"/>
  <DataGrid x:Name="dgAdresse" AutoGenerateColumns="False" ItemsSource="{Binding Adressen}" IsReadOnly="False">
      <DataGrid.Columns>
          <DataGridTextColumn Header="Straße" IsReadOnly="False" Binding="{Binding Strasse}" />
          <DataGridTextColumn Header="PLZ" IsReadOnly="False" Binding="{Binding PLZ}"/>
          <DataGridTextColumn Header="Ort" IsReadOnly="False" Binding="{Binding Ort}"/>
           <DataGridTextColumn Header="Bundesland" IsReadOnly="False" Binding="{Binding Bundesland}"/>
           <DataGridTextColumn Header="Staat" IsReadOnly="False" Binding="{Binding Land}"/>
           <DataGridTextColumn Header="Beschreibung" IsReadOnly="False" Binding="{Binding Beschreibung}"/>
       </DataGrid.Columns>
   </DataGrid>
</StackPanel>
Vielen Dank schon mal.

ps: Ich kann erst morgen wieder antworten
 

Haubentaucher

Cadet 4th Year
Dabei seit
Mai 2011
Beiträge
72
Hmm sehe jetzt nichts falsches an dem Code. Wenn die Rows jedoch verschwinden, dann heißt des, dass die Items aus der ItemsSource entfernt werden. Von dem her wäre auch das VM, bzw. der DataContext, interessant.
 

Raknar

Ensign
Ersteller dieses Themas
Dabei seit
Apr. 2006
Beiträge
138
@Haubentaucher
Das Ganze passiert auf einem Tab. Das MainWindowViewModel initialisiert eine Instanz im Konstruktor zu diesem Tab. Das muss irgendein dummer Fehler sein.
Code:
class LieferantTabViewModel : ViewModelBase
    {
        #region Properties
        //**********************Firma Suchergebnisse****************************************************************
        private ObservableCollection<FirmaViewModel> m_SuchErgebnisse;

        public ObservableCollection<FirmaViewModel> SuchErgebnisse
        {
            get { return m_SuchErgebnisse; }
            private set
            {
                if (value != m_SuchErgebnisse)
                {
                    m_SuchErgebnisse = value;
                    onPropertyChanged("SuchErgebnisse");
                }
            }
        }

        //****************************Ausgewählte Firma****************************************************************
        private FirmaViewModel m_AusgewaehlteFirma;

        public FirmaViewModel AusgewaehlteFirma
        {
            get { return m_AusgewaehlteFirma; }
            set
            {
                if (value != m_AusgewaehlteFirma)
                {
                    m_AusgewaehlteFirma = value;
                    onPropertyChanged("AusgewählteFirma");

                    if (m_AusgewaehlteFirma != null)
                    {
                        onAdressenAuflistenExecuted(null);
                    }
                }
            }
        }
        //********************Adressen auflisten**********************************************************
        private ObservableCollection<FirmaViewModel> m_Adressen;

        public ObservableCollection<FirmaViewModel> Adressen
        {
            get { return m_Adressen; }
            private set
            {
                if (value != m_Adressen)
                {
                    m_Adressen = value;
                    onPropertyChanged("Adressen");
                }
            }
        }
        #endregion

        #region Commands

        public ICommand FirmenSuchenCommand { get; private set; }

        private void onFirmenSuchenExecuted(object parameter)
        {
            String suche = String.Empty;
            if (parameter != null)
            {
                suche = parameter.ToString();
            }

            m_SuchErgebnisse.Clear();
            //TextBox Value
            List<Firma> ergebnis = TabLieferantenMethods.showFirmen(suche);

            foreach (Firma item in ergebnis)
            {
                m_SuchErgebnisse.Add(new FirmaViewModel(item));
            }

            if (ergebnis.Count > 0)
            {
                AusgewaehlteFirma = m_SuchErgebnisse[0];
            }
        }

        public ICommand SaveChangesCommand { get; private set; }

        private void onSaveChangesExecuted(object parameter)
        {
            Firma firma = m_AusgewaehlteFirma.GetModel();
            DataBaseManager.SaveChanges();
        }

        private Boolean onSaveChangeCanExecuted(object paramter)
        {
            return m_AusgewaehlteFirma != null;
        }

        public ICommand AdressenAuflistenCommand { get; set; }
        private void onAdressenAuflistenExecuted (object parameter)
        {
          List<Adresse>result = TabLieferantenMethods.SucheAdressen(m_AusgewaehlteFirma.GetModel().ID);
          m_AusgewaehlteFirma.Adressen.Clear();

          foreach (Adresse item in result)
          {
              m_AusgewaehlteFirma.Adressen.Add(new AdressViewModel(item));
          }
        }

        #endregion

        #region Constructor

        public LieferantTabViewModel()
        {
            FirmenSuchenCommand = new RelayCommand(onFirmenSuchenExecuted);
            SaveChangesCommand = new RelayCommand(onSaveChangesExecuted, onSaveChangeCanExecuted);
            AdressenAuflistenCommand = new RelayCommand(onAdressenAuflistenExecuted);
            SuchErgebnisse = new ObservableCollection<FirmaViewModel>();
        }

        #endregion
    }
 

Haubentaucher

Cadet 4th Year
Dabei seit
Mai 2011
Beiträge
72
Ich vermute jetzt mal das die Adressen eine List ist. Versuch mal diese zu einer ObservableCollection zu ändern oder ein OnPropertyChangedEvent auf die Adressen zu machen.
 

Raknar

Ensign
Ersteller dieses Themas
Dabei seit
Apr. 2006
Beiträge
138
@ Haubentaucher
Erstmal Danke für die Antwort :)
Du meinst jetzt aber nicht das, was schon in Zeile 43 steht, oder?

Das ist eine ObservableCollection aus FirmaViewModel. Diese Klasse wiederum hat u.a. folgende Property:
Code:
private ObservableCollection<AdressViewModel> m_Adressen;

        public ObservableCollection<AdressViewModel> Adressen
        {
            get { return m_Adressen; }
            private set
            {
                if (value != m_Adressen)
                {
                    m_Adressen = value;
                    onPropertyChanged("Adressen");
                }
            }
        }
Ein AdressViewModel selbst hat eibe private Adresse und die Properties zu Straße, PLZ, usw. und eine GetModel-Methode.
Oder meinst du etwas anderes?
 

Haubentaucher

Cadet 4th Year
Dabei seit
Mai 2011
Beiträge
72
Hallo ja aber du fügst der Liste Adressen auf die du bindest ObservableCollection<FirmaViewModel> Adressen die Werte hinzu sondern der Liste im AusgewaehlteFirma.Adressen. Du kannst im DataGrid auf diese Liste binden, dann sollte es funktionieren.
 

Raknar

Ensign
Ersteller dieses Themas
Dabei seit
Apr. 2006
Beiträge
138
@Haubentaucher
Meinst du das so:
Code:
<StackPanel>
<Label Content="Adresse"/>
<DataGrid x:Name="dgAdresse" AutoGenerateColumns="False" ItemsSource="{Binding Adressen}" IsReadOnly="False">
<DataGrid.Columns>
  <DataGridTextColumn Header="Straße" IsReadOnly="False" Binding ="{Binding Source=AusgewaehlteFirma.Adressen, Path=Strasse}" />
  <DataGridTextColumn Header="PLZ" IsReadOnly="False" Binding="{Binding Source=AusgewaehlteFirma.Adressen, Path=PLZ}"/>
  <DataGridTextColumn Header="Ort" IsReadOnly="False" Binding="{Binding Source=AusgewaehlteFirma.Adressen, Path=Ort}"/>
  <DataGridTextColumn Header="Bundesland" IsReadOnly="False" Binding="{Binding Source=AusgewaehlteFirma.Adressen, Path=Bundesland}"/>
  <DataGridTextColumn Header="Staat" IsReadOnly="False" Binding="{Binding Source=AusgewaehlteFirma.Adressen, Path=Land}"/>
  <DataGridTextColumn Header="Beschreibung" IsReadOnly="False" Binding="{Binding Source=AusgewaehlteFirma.Adressen, Path=Beschreibung}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
Das funktioniert nicht wirklich. Da bleiben die Zeilen leer bzw. deren Anzahl bleibt gleich. Ich glaube, dass ich deinen Post nicht so ganz verstanden habe;)
 

Raknar

Ensign
Ersteller dieses Themas
Dabei seit
Apr. 2006
Beiträge
138
@Haubentaucher
Wenn ich als
Code:
ItemsSource="{Binding AusgewaehlteFirma.Adressen}"
definiere, wird nichts angezeigt.

Ich glaube, dass der Code in meinem ersten Post nicht ganz falsch ist, denn es werden Ergebnisse geliefert. Wenn ich in der ItemsSource den Cursor auf "Adressen" setze, komme ich mit F12 ja zu der richtigen Stelle (Zeile 43). Mache ich das allerdings mit den Properties, wird nur generell auf die Klasse LieferantenTabViewModel verwiesen. Jetzt ist die Frage also, wie ich an die in der XAML ran komme.
 
Top