Hier aufklappen um sämtliche Kategorien zu durchstöbern.

MVVM: Das Model

6. Mai 2010 in WPF | Silverlight

Kürzlich habe ich eine Anfrage erhalten, was die einzelnen Objekte, welche durch das Pattern MVVM beschrieben werden, tatsächlich beinhalten. Darauf möchte ich kurz mit meiner Interpretation dieses Patterns eingehen und zur Diskussion stellen.

Definition Model

Vielfach wird das Model als reine Abbildung der Datenquelle gesehen. Dies ist für MVVM nicht immer richtig. Vielmehr stellt das Model eine Abbildung der Daten dar, welche für die visuelle Anwendung benötigt werden. Das Model enthält also Daten, die dem Benutzer zur Verfügung gestellt und von ihm manipuliert werden.

Dies bedeutet aber auch, dass das Model folgende Funktionalitäten bereit stellt:

  • Validierung
  • Benachrichtigung bei Eigenschafts-Änderungen
  • Verarbeitung von Business-Rules

Was tatsächlich im Model zum Einsatz kommt, wird durch die Anforderungen an das Model bestimmt. Im Grunde werden für das Model die Interfaces INotifyPropertyChanged (für die Benachrichtigung von Eigenschafts-Änderungen) und IDataErrorInfo (Validierung) implementiert. Werden die Daten von einem OR-Mapper oder einem Service zurück geliefert, kann aus meiner Sicht die Model-Schicht entfallen und diese Funktionalität nur im ViewModel implementiert werden.

Beispielhaftes Model

Eine Basis für ein Model könnte folgendermaßen abgebildet werden:

public class ModelBase : INotifyPropertyChanged, IDataErrorInfo
{
    protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
 
    #region INotifyPropertyChanged Members
 
    public event PropertyChangedEventHandler PropertyChanged;
 
    #endregion
 
    #region IDataErrorInfo Members
 
    public virtual string Error
    {
        get { return String.Empty; }
    }
 
    public virtual string this[string columnName]
    {
        get { return String.Empty; }
    }
 
    #endregion
}

Und hier nun ein konkretes Beispiel für ein Model, welches ein einfaches Unternehmen repräsentiert:

public class CompanyModel : ModelBase
{
    private string name;
    private string street;
    private string streetNumber;
    private string city;
    private string zip;
    private string country;
 
    public string Name
    {
        get { return name; }
        set
        {
            if (name == value)
                return;
            name = value;
            RaisePropertyChanged("Name");
        }
    }
 
    public string Street
    {
        get { return street; }
        set
        {
            if (street == value)
                return;
            street = value;
            RaisePropertyChanged("Street");
        }
    }
 
    public string StreetNumber
    {
        get { return streetNumber; }
        set
        {
            if (streetNumber == value)
                return;
            streetNumber = value;
            RaisePropertyChanged("StreetNumber");
        }
    }
 
    public string City
    {
        get { return city; }
        set
        {
            if (city == value)
                return;
            city = value;
            RaisePropertyChanged("City");
        }
    }
 
    public string Zip
    {
        get { return zip; }
        set
        {
            if (zip == value)
                return;
            zip = value;
            RaisePropertyChanged("Zip");
        }
    }
 
    public string Country
    {
        get { return country; }
        set
        {
            if (country == value)
                return;
            country = value;
            RaisePropertyChanged("Country");
        }
    }
 
    public override string this[string columnName]
    {
        get
        {
            switch (columnName)
            {
                case "Name":
                    if (String.IsNullOrWhiteSpace(Name))
                        return "Name des Unternehmens muss befüllt sein";
                    break;
            }
            return null;
        }
    }
}

Die weiteren Objekte des MVVM-Patterns:

MVVM: Die View
MVVM: Das ViewModel

kick it on dotnet-kicks.de

blog comments powered by Disqus
Anmelden