Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Binden an DataGrid- DataGrid
MMCSharp
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

Binden an DataGrid- DataGrid

beantworten | zitieren | melden

Hallo zusammen,

Ich würde gerne an ein Datagrid in einem RowDetailsTemplate Binden. Leider komme ich nicht weiter, da ich es nicht schaffe das Grid im Grid anzusprechen im XAML. Wie kann ich das anstellen?

das hat für den übergeordneten DataGrid geklappt

 <TextBox Height="20" Width="200" Margin="3" Text="{Binding ElementName=Main_DataGrid,Path=SelectedItem.City, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

Nun Steckt aber eben in den RowDetails ein weiterer Grid den ich gerne auch binden würde. rein theoretisch so:

 <TextBox Height="20" Width="200" Margin="3" Text="{Binding ElementName=Main_DataGrid.SecondGrid ,Path=SelectedItem.CityHouses, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

was aber nicht funktioniert
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.803
Herkunft: Düsseldorf

beantworten | zitieren | melden

Das geht nicht oder nur sehr, sehr umständlich.

Aber im zweiten Grid zeigst Du doch auch nur die Daten vom SelectedItem des ersten Grids an, warum bindest Du dann nicht gegen die entsprechende Property?


<TextBox Height="20" Width="200" Margin="3" Text="{Binding ElementName=Main_DataGrid, Path=SelectedItem.SelectedCityHouse, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>


Und das gleiche würde ich auch für's erste Grid machen.
Am DataGrid das SelectedItem ans ViewModel binden, dann kannst Du A. aus dem ViewModel heraus das SelectedItem steuern und B. an anderer Stelle einfacher daran binden.
private Nachricht | Beiträge des Benutzers
MMCSharp
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

beantworten | zitieren | melden

Ich wollte das VM nicht so überladen, deswegen wäre ich gern diesen Weg gegangen.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MMCSharp am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.928

beantworten | zitieren | melden

Das ist aber die Idee des Systems hinter MVVM in WPF.
Lohnt sich schon, das dann auch so zu machen, wie es konzipiert ist ;-)
private Nachricht | Beiträge des Benutzers
MMCSharp
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

beantworten | zitieren | melden

Ich bringe das alles nicht auf die Kette..

Aktuell implementiert mein "Model", das die ObservabaleCollection lädt, nahezu die komplette logic für das Handling. Ich lade dort Daten aus der Datenbank (SQLServer), füge sie der Collection hinzu und registriere die Ereignise auf die Items. Adaptiv dazu werden in den registrierten Ereignishändlern dann die Daten in die Datenbank geschrieben bzw verändert. Das Ganze lade ich Async mit dem Befehl:


public async void DataLoading() { await Task.Run(() => Load_Warehouses()); }

private void Load_Warehouses()
        {
            var WMod = new WarehouseModel();
            WareHouseCollection = WMod.LoadWarehouses();
            RaisePropertyChanged(nameof(WareHouseCollection));
        }

Mache ich das so ansatzweise richtig....?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.928

beantworten | zitieren | melden

Collections (besonders ObservableCollection) sollte man in diesem Fall nicht neu zuweisen, sondern wenn dann Leeren und neu befüllen.
Ansonsten ist das eine neue Referenz und einige Bindungs / Event Themen referenzieren dann das falsche / ein anderes Objekte (aka Liste).

Auch das Modell erzeugst Du eigentlich nicht neu.

Eigentlich hast Du sowas, was auch das Tutorial zeigt:


public class MyViewModel
{
   public MyViewModel(IWareHouseRepository warehouseRepository) // Mit Dependecy vermeidet man, dass man die SQL Verbindung manuell erstellt und verwalten muss
   {
      _warehouseRepository = warehouseRepository;
   }

   public ObservableCollection<WareHouseModel> WareHouseCollection {get;}  = new();

   public async Task LoadWareHouses()
   { 
      WareHouseCollection.ClearItems();
      List<WareHouseEntity> wareHouses = await _warehouseRepository.GetAllAsync();
      foreach(var wh in wareHouses )
      {
         WareHouseCollection.Add(new WareHouseModel(wh.Id, wh.Name));
      }
   }

   public ICommand LoadWareHousesCommand
   {
       get { return new DelegateCommand(LoadWareHouses); } // bin mir nicht mehr sicher, aber glaub DelegateCommand war hier das richtige
    }
}
Im Editor runter getippt, sicher irgendwo nen Typo drin.

Daher: in deinem Ansatz sind schon paar Fehler :-)
private Nachricht | Beiträge des Benutzers
MMCSharp
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

beantworten | zitieren | melden

Vielen Dank dafür!
Damit komme ich bestimmt weiter! Vielen Dank!
private Nachricht | Beiträge des Benutzers