Het doorgeven van database-informatie van het ene ViewModel naar het andere met behulp van Entity Framework en MVVM

Mijn titel rechtvaardigt niet zoveel wat ik probeer te doen. Ik ben redelijk nieuw in het gebruik van Entity Framework zo kaal bij mij. Ik heb een MVVM-toepassing die Entity Framework 4.1, wpf en C# gebruikt. Ik probeer het zo te krijgen dat wanneer ik dubbelklik een rij van een datagrid (het raster bindt aan een EntitySet in mijn DataBase met de naam LoanComparisons) in een weergave die ik LoanListingView heb genoemd, deze overschakelt naar mijn andere weergave (genaamd LoanCalculatorView) die de informatie in mijn database (EntitySet met de naam Leningen) doorgeeft aan de hand van de informatie in de rij die werd geselecteerd.

Tot nu toe heb ik de app al zo bekabeld dat ik dubbelklik op een rij in LoanListingView DataGrid opent LoanCalculatorView met standaardwaarden die in de velden zijn ingevoerd.

Nu voor wat code. Hier is mijn DataGrid die zich bindt aan mijn database-entiteitenset met de naam LoanComparisons:

       

            
                
                
                
                
            
        

Dubbelklikken op een rij opent mijn LoanCalculatorView met vooraf ingestelde waarden. Momenteel voert de DoubleClick-gebeurtenis deze code uit:

      /// Handles double-clicks on datagrid rows
    private void OnDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (sender != null)
        {
            DataGrid grid = sender as DataGrid;
            if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
            {
                DataGridRow dgr = grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem) as DataGridRow;
              _viewModel.Open(null);


              //The DataContext will be set to dgr but since "DataGridRow"
              //does not contain the Open method I cant do this:
             // DataContext = dgr;
              //dgr.Open(dgr);
              //
              //I think this is where I am lost at

            }
        }
    }

Op dit moment geeft de methode Open een ongeldige waarde door in de methode omdat ik niet zeker weet hoe ik de informatie van mijn andere EntitySet met de naam 'Leningen' moet doorgeven. De open methode is als volgt:

//Creates a new LoanCalculatorViewModel that calls the SetComparisonDataRecord method
//passing it an argument comparison and changes the DataContext to LoanCalculatorView.
  public void Open(LoanComparison comparison)
  {
     var loanCalculatorViewModel = new LoanCalculatorViewModel();

     loanCalculatorViewModel.SetComparisonDataRecord(comparison);

     var loanCalculatorView = new LoanCalculatorView {DataContext = loanCalculatorViewModel};

     loanCalculatorView.Show();
  }

Ten slotte is het SetComparisonDataRecord op dit moment gewoon leeg, maar ik heb een opmerking geplaatst over wat er in zou moeten staan ​​en hoe ik de waarden wil instellen:

      public void SetComparisonDataRecord(LoanComparison comparison)
  {


     //SharedValues.HomeValue = comparison.HomeValue;

  }

Een ander ding om in gedachten te houden, mijn twee EntitySets hebben een een-op-veel relatie. Eén lening en een verzameling leningcompensaties. Is het mogelijk om mij te laten zien hoe ik de informatie uit de geselecteerde rij (die een entiteit van mijn LoanComparisons EntitySet representeert) doorgeeft aan de LoanCalculatorView? Alvast heel erg bedankt!

2

2 antwoord

Een suggestie om hoofdpijnen te voorkomen, is om een ​​eigenschap te binden aan de SelectedItem-eigenschap van de datagrid, zodat u zich geen zorgen hoeft te maken over de "huidige selectie" bij het starten van de Double-Click-gebeurtenis.

Voor wat je aan het doen bent, zou ik de oproepen als volgt omschrijven:

  1. Voer de eerste oproep naar EF uit voor de eerste rasterweergave, zodat de lijst kan worden gevuld.
  2. Ervan uitgaande dat elk item een ​​Id heeft vanwege primaire sleutels of een uniek ID, geeft u alleen die waarde door als de parameter voor uw pop-upvenster.
  3. Tijdens het laden van uw viewmodel tijdens het laden van het pop-upvenster, maakt u met LINQ de entiteit voor de record met ID "passed id".
  4. Neem de geretourneerde Entiteit POCO, sla deze op in een property in uw viewmodel en open deze in uw weergave.
  5. Opmerking: zorg ervoor dat u INotifyPropertyChanged gebruikt voor al uw viewmodel-eigenschappen, zodat de weergave correct wordt vernieuwd.

Is dat in wezen wat je zoekt?

0
toegevoegd
Bedankt :) het had wat hulp nodig van enkele coderende vrienden om me te helpen. Ik zal mijn antwoord plaatsen
toegevoegd de auteur justin peterson, de bron

Mijn OnDoubleClick-methode zo gewijzigd dat de DataContext wordt ingesteld in de methode Open:

 private void OnDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (sender != null)
        {
            DataGrid grid = sender as DataGrid;
            if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
            {           
                var lc = grid.SelectedItem as LoanComparison;
                if (lc != null) _viewModel.Open(lc);

            }
        }
    }

eenvoudige open methode:

public void Open(LoanComparison comparison)
  {
     var loanCalculatorViewModel = new LoanCalculatorViewModel();

     loanCalculatorViewModel.SetComparisonDataRecord(comparison);

     var loanCalculatorView = new LoanCalculatorView {DataContext = loanCalculatorViewModel};

     loanCalculatorView.Show();
  }

Daarvandaan schreef ik een basisvraag waarin mijn database werd gevraagd naar de entiteit "lening":

public void SetComparisonDataRecord(LoanComparison comparison)
           {

     var calcEntities = new LoanCalcEntities();

     var currentLoan = from loan in calcEntities.Loans
                       where loan.LoanId == comparison.CurrentLoanId
                       select loan;


     var proposedLoan = from loan in calcEntities.Loans
                       where loan.LoanId == comparison.ProposedLoanId
                       select loan;

     //SharedValues.HomeValue = comparison.HomeValue;

  }

Sorry voor de moeite! Bedankt voor de hulp :)

0
toegevoegd