Laden...

Wie bekomme ich Daten aus Datenbank in Viewmodel, in die OberseverableCollection und in den View?

Erstellt von olliks1973 vor 3 Jahren Letzter Beitrag vor 3 Jahren 687 Views
O
olliks1973 Themenstarter:in
8 Beiträge seit 2019
vor 3 Jahren
Wie bekomme ich Daten aus Datenbank in Viewmodel, in die OberseverableCollection und in den View?

Hallo, bin Anfänger und habe erhebliche Probleme meine Daten in mein DataGrid zu bekommen.
Ich habe ein Model :

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Verwaltung.ViewModels;

namespace Verwaltung
{
    public class Kunden : ViewModelBase
    {
        [Key]
        public int Id { get; set; }

        private string _anrede;
        private string _vorname;
        private string _nachname;
        private string _strasse;
        private string _hausnummer;
        private int _plz;
        private string _wohnort;
        private string _bundesland;
        private DateTime _geburtstag;
        private int _personenalter;
        private double _rechnungsbetrag;

        [StringLength(4)]
        public string Anrede
        {
            get
            {
                return _anrede;
            }
            set
            {
                _anrede = value;
            }
        }
        [StringLength(30)]
        public string Vorname
        {
            get
            {
                return _vorname;
            }
            set
            {
                _vorname = value;
            }
        }
        [StringLength(30)]
        public string Nachname

        {
            get
            {
                return _nachname;
            }
            set
            {
                _nachname = value;
            }
        }
        [StringLength(40)]
        public string Strasse
        {
            get
            {
                return _strasse;
            }
            set
            {
                _strasse = value;
            }
        }
        [StringLength(5)]
        public string Hausnummer
        {
            get
            {
                return _hausnummer;
            }


            set
            {
                _hausnummer = value;
            }
        }
        public int Plz
        {
            get
            {
                return _plz;
            }
            set
            {
                _plz = value;
            }
        }
        [StringLength(30)]
        public string Wohnort
        {
            get
            {
                return _wohnort;
            }
            set
            {
                _wohnort = value;
            }
        }
        [StringLength(22)]
        public string Bundesland
        {
            get
            {
                return _bundesland;
            }
            set
            {
                _bundesland = value;
            }
        }
        [Column(TypeName = "Date")]
        public DateTime Geburtstag
        {
            get
            {
                return _geburtstag;
            }
            set
            {
                _geburtstag = value;
            }
        }
        public int Personenalter
        {
            get
            {
                return _personenalter;
            }
            set
            {
                _personenalter = value;
            }
        }
        public double Rechnungsbetrag
        {
            get
            {
                return _rechnungsbetrag;
            }
            set
            {
                _rechnungsbetrag = value;
            }
        }
    }
}

Darüber Hinaus habe ich eine Context-Datei (Entity Framework):


using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Verwaltung
{
    class KundenContext : DbContext
    {
        public KundenContext()
                : base("name=KundenDb")
        {
        }
        public DbSet<Kunden> Kundens { get; set; }

    }
}

Nun habe ich mir ein ViewModel erstellt :

[CSHARP]using System;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Verwaltung.Commands;

namespace Verwaltung.ViewModels
{
    public class ListeViewModel : ViewModelBase
    {

        public ObservableCollection<Kunden> _kundenDataCollection = new ObservableCollection<Kunden>();

        public ObservableCollection<Kunden> KundenDataCollection
        {
            get { return _kundenDataCollection; }
            set { _kundenDataCollection = value; }
        }

        public ListeViewModel()
        {
            MVVMClick = new RelayCommand(new Action<object>(AddKunden));
        }

        private ICommand m_ButtonCommand;
        public ICommand MVVMClick
        {
            get { return m_ButtonCommand; }
            set { m_ButtonCommand = value; }
        }

        public void AddKunden(object obj)
        {
            var person = new Kunden
            {
                Anrede = "Herr",
                Vorname = "Bernd",
                Nachname = "Beier",
                Strasse = "Feldweg",
                Hausnummer = "34",
                Plz = 10564,
                Wohnort = "Berlin",
                Personenalter = 34,
                Bundesland = "Hessen",
                Geburtstag = new DateTime(2016, 6, 28),
                Rechnungsbetrag = 345.23
            };
            _kundenDataCollection.Add(person);
        }
    }

}

und letztendlich einen View.

Wie bekomme ich die Daten nun aus meiner Datenbank in das Viewmodel, dann in die OberseverableCollection und dann in den View? Ich habe das ganze zuvor mit DB Context direkt an das Datagrid gebunden ohne MVVM, das klappt aber ich bekomme das mit der Observerable Collection nicht hin.

Eventull kann jemand helfen??

PS: Mein ViewModel erbt von BaseViewModel mit INotifyPropertyChanged.

ich wäre für jede Hilfe dankbar 😃

F
10.010 Beiträge seit 2004
vor 3 Jahren

Schön, wenn das VM von der Basisklasse erbt, aber benutzen musst du das OnPropertyChanged auch.

Und was ist jetzt so schwer die Daten per DataContext in eine liste zu lesen und diese dann der Collection hinzuzufügen?

O
olliks1973 Themenstarter:in
8 Beiträge seit 2019
vor 3 Jahren

Das Problem ist, dass ich das erst ein paar Tage mache. Das mit der Liste habe ich schon probiert und die Meldung besagt, das ich mein DB Set der Collection nicht hinzufügen kann 😦 OnPropertyChanged habe ich noch nicht benutzt, ich wollte erst ein mal die Daten in das Grid bekommen

16.834 Beiträge seit 2008
vor 3 Jahren

Unter absolut keinem Fall solltest Du UI-Modelle für die Datenbank verwenden.
Niemals => [Artikel] Drei-Schichten-Architektur
UI Modelle haben i.d.R. immer UI-technologische Eigenschaften, die nicht in das Datenbank-Modell gehören (und umgekehrt).

Und für Zeiten bitte immer immer immer DateTimeOffset verwendet und nicht DateTime.
[FAQ] DateTime vs. DateTimeOffset und der Umgang mit Zeiten in .NET

Laden (normalerweise) wie folgt:

  • Query der Entitäten aus der Datenbank
  • Entitäten zu ViewModels mappen (zB. automatisiert via AutoMapper)
  • ViewModels (Liste der geladenen Kunden) an das ViewModel des Windows binden

Für die ersten Schritte kannst Du die Entitäten auch direkt an das ViewModel binden.


public class CustomerEntity : DatabaseEntity 
{
  // Id, Name...
}


public class CustomerListViewModel
{
     public ObservableCollection<CustomerEntity> KundenDataCollection

    // Methode für das Laden der Kunden
}

Aufbau ist sehr gut dargestellt in [Artikel] MVVM und DataBinding

O
olliks1973 Themenstarter:in
8 Beiträge seit 2019
vor 3 Jahren

ich schau mir das mal an vielen dank 😃

S
39 Beiträge seit 2019
vor 3 Jahren

Ich habe mich in den letzten Tagen auch intensiv mit diesem Thema befasst und bin auf die MVVM mittels Caliburn.Micro gestoßen.

Das Video dazu findest Du hier.

Seitdem ich mich mit WPF befasse (was etwa zwei Wochen ist) hab ich diese Videos von Tim Corey regelrecht verschlungen. Hab viel Freude damit.

<edit> Meine Erste Antwort hier 8). Bis jetzt kamen nur dämliche Fragen </edit>

2 stupid 4 chess? No way.
2 stupid 4 C#? It seems so X(

F
10.010 Beiträge seit 2004
vor 3 Jahren

Es ist zwar gut das Du dir ein MVVM Framework rausgesucht hast, leider ist die Weiterentwicklung eingestellt.
https://caliburnmicro.com/announcements/ ( etwas runterscrollen ).

S
39 Beiträge seit 2019
vor 3 Jahren


>
( etwas runterscrollen ).

Hoppala - Dankeschön für die Info

2 stupid 4 chess? No way.
2 stupid 4 C#? It seems so X(