© 2012 Microsoft Corporation. Alle Rechte vorbehalten.   Microsoft Student Partners
Wer kann das MVC-Pattern
erklären?
Und jetzt etwas ganz anderes:
Datenbindung
Bei der Datenbindung geht es darum,
zwei Datenquellen bzw. -senken zu
verbinden und synchron zu halten.
DEMO
Es gibt drei Arten der Datenbindung:
One-Way (Wenn sich A ändert, ändert sich auch B)



     A                  B
Es gibt drei Arten der Datenbindung:
Two-Way (Wenn sich A ändert, ändert sich B und wenn sich B
ändert, ändert sich A)


     A                  B
Es gibt drei Arten der Datenbindung:
One-Time (B erhält einmalig den Wert von A)


               1x
     A                   B
DEMO
Datenbindung zwischen UI und Datenmodell
Restaurant
string Name;

string Category;

float Rating;

int RatingCount;

ImageSource Photo;

Address Address;

string OpeningHours;

string Description;

Comment[] Comments;
Restaurant            Comment
string Name;           string Title;

string Category;       float Rating;

float Rating;          User Author;

int RatingCount;       string Text;

ImageSource Photo;

Address Address;

string OpeningHours;

string Description;

Comment[] Comments;
Jedes XAML-Steuerelement hat eine
Eigenschaft „DataContext“, die auf
das Datenmodell verweist.
Restaurant
    string Name;

    string Category;

    float Rating;

    int RatingCount;

    ImageSource Photo;

    Address Address;
?   string OpeningHours;

    string Description;

    Comment[] Comments;
Was wir bisher gesehen haben:
Die View ist direkt an das Model gebunden.



    Model               View
Problem-Domäne               UI-Domäne




         Model                    ViewModel               View




Das ViewModel ist eine Abstraktion der View. Es stellt
Informationen aus dem Model so bereit, wie es die View benötigt.
Gleichzeitig nimmt es Informationen aus der View entgegen und
bringt diese in das Model ein.
Model-View-ViewModel (MVVM)
Restaurant
                         string Name;

                         string Category;

                         float Rating;
RestaurantViewModel
                         int RatingCount;
Restaurant Restaurant;
                         ImageSource Photo;
float UserRating;
                         Address Address;

                         string OpeningHours;

                         string Description;

                         Comment[] Comments;
C#                                                       C#
class RestaurantViewModel                                class Restaurant
{                                                        {
    public Restaurant Restaurant { get; private set; }       private float aggregatedRating = 0;

     public float UserRating                                  public float Rating
     {                                                        {
        get                                                       get
        {                                                         {
             return _userRating;                                      return aggregatedRating / RatingCount;
        }                                                         }
                                                              }
         set
         {                                                    public int RatingCount { get; private set; }
               _userRating = value;
               Restaurant.Rate(_userRating);                  public void Rate(float rating)
         }                                                    {
     }                                                            aggregatedRating += rating;
}                                                                 RatingCount++;
                                                              }
                                                         }
Restaurant
                         string Name;

                         string Category;

                         float Rating;
RestaurantViewModel
                         int RatingCount;
Restaurant Restaurant;
                         ImageSource Photo;
float UserRating;
                         Address Address;

                         string OpeningHours;

                         string Description;

                         Comment[] Comments;
C#

interface INotifyPropertyChanged
{
   event PropertyChangedEventHandler PropertyChanged;
}
C#

class Restaurant
{
    public void Rate(float rating)
    {
        aggregatedRating += rating;
        RatingCount++;

         OnRatingChanged();
     }

     private void OnRatingChanged()
     {
         if (PropertyChanged != null)
         {
             PropertyChanged(this, new PropertyChangedEventArgs("Rating"));
         }
     }

     public event PropertyChangedEventHandler PropertyChanged;
}
Commands erlauben es, UI-
Ereignisse (z.B. Klicks) über
Datenbindung an ein ViewModel
weiterzuleiten.
ValueCoverter stehen zwischen
Datenbindungsquelle und –ziel und
konvertieren Werte.
DEMO

Datenbindung mit XAML in Windows 8

  • 1.
    © 2012 MicrosoftCorporation. Alle Rechte vorbehalten. Microsoft Student Partners
  • 2.
    Wer kann dasMVC-Pattern erklären?
  • 3.
    Und jetzt etwasganz anderes: Datenbindung
  • 4.
    Bei der Datenbindunggeht es darum, zwei Datenquellen bzw. -senken zu verbinden und synchron zu halten.
  • 5.
  • 6.
    Es gibt dreiArten der Datenbindung: One-Way (Wenn sich A ändert, ändert sich auch B) A B
  • 7.
    Es gibt dreiArten der Datenbindung: Two-Way (Wenn sich A ändert, ändert sich B und wenn sich B ändert, ändert sich A) A B
  • 8.
    Es gibt dreiArten der Datenbindung: One-Time (B erhält einmalig den Wert von A) 1x A B
  • 9.
  • 10.
    Datenbindung zwischen UIund Datenmodell
  • 11.
    Restaurant string Name; string Category; floatRating; int RatingCount; ImageSource Photo; Address Address; string OpeningHours; string Description; Comment[] Comments;
  • 12.
    Restaurant Comment string Name; string Title; string Category; float Rating; float Rating; User Author; int RatingCount; string Text; ImageSource Photo; Address Address; string OpeningHours; string Description; Comment[] Comments;
  • 13.
    Jedes XAML-Steuerelement hateine Eigenschaft „DataContext“, die auf das Datenmodell verweist.
  • 14.
    Restaurant string Name; string Category; float Rating; int RatingCount; ImageSource Photo; Address Address; ? string OpeningHours; string Description; Comment[] Comments;
  • 15.
    Was wir bishergesehen haben: Die View ist direkt an das Model gebunden. Model View
  • 16.
    Problem-Domäne UI-Domäne Model ViewModel View Das ViewModel ist eine Abstraktion der View. Es stellt Informationen aus dem Model so bereit, wie es die View benötigt. Gleichzeitig nimmt es Informationen aus der View entgegen und bringt diese in das Model ein.
  • 17.
  • 18.
    Restaurant string Name; string Category; float Rating; RestaurantViewModel int RatingCount; Restaurant Restaurant; ImageSource Photo; float UserRating; Address Address; string OpeningHours; string Description; Comment[] Comments;
  • 19.
    C# C# class RestaurantViewModel class Restaurant { { public Restaurant Restaurant { get; private set; } private float aggregatedRating = 0; public float UserRating public float Rating { { get get { { return _userRating; return aggregatedRating / RatingCount; } } } set { public int RatingCount { get; private set; } _userRating = value; Restaurant.Rate(_userRating); public void Rate(float rating) } { } aggregatedRating += rating; } RatingCount++; } }
  • 20.
    Restaurant string Name; string Category; float Rating; RestaurantViewModel int RatingCount; Restaurant Restaurant; ImageSource Photo; float UserRating; Address Address; string OpeningHours; string Description; Comment[] Comments;
  • 21.
    C# interface INotifyPropertyChanged { event PropertyChangedEventHandler PropertyChanged; }
  • 22.
    C# class Restaurant { public void Rate(float rating) { aggregatedRating += rating; RatingCount++; OnRatingChanged(); } private void OnRatingChanged() { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Rating")); } } public event PropertyChangedEventHandler PropertyChanged; }
  • 23.
    Commands erlauben es,UI- Ereignisse (z.B. Klicks) über Datenbindung an ein ViewModel weiterzuleiten.
  • 24.
    ValueCoverter stehen zwischen Datenbindungsquelleund –ziel und konvertieren Werte.
  • 25.

Hinweis der Redaktion

  • #3 Was an Antworten kommen sollte (sonst ggf. nachhelfen):Das Model bildet die Daten und Operationen abstrakt aus Sicht der Problemdomäne abDie View ist eine mögliche Darstellung der Daten im ModelDer Controller vermittelt zwischen View und Model und übersetzt Befehle aus der View in Operationen auf dem ModelDas View registriert sich am Model und wird über Veränderungen informiert (Observer Pattern)MVC sorgt für eine lose Kopplung der einzelnen komponenten
  • #6 https://github.com/HorizonNet/DEMO-Windows8-DataBinding-1 (Diese Demo bitte nicht nur zeigen sondern live bauen)
  • #10 https://github.com/HorizonNet/DEMO-Windows8-DataBinding-2 (Diese Demo bitte nicht nur zeigen sondern live bauen)
  • #12 Über Datenbindung lässt sich eine View direkt mit Daten aus dem Datenmodell befüllen
  • #13 Das Funktioniert auch mit Listen
  • #14 Die DataContext-Eigenschaft wird auch an Kindelemente vererbt.
  • #15 Wie aber lassen sich Änderungen aus der UI an das Datenmodell zurückspielen? Es gibt natürlich Two-Way-Datenbindung, aber das Datenmodell hat dafür keinen „Empfänger“. Das Datenmodell entsprechend anzupassen würde eine Abhängigkeit zwischen View und Model erzeugen.
  • #19 Wie aber lassen sich Änderungen aus der UI an das Datenmodell zurückspielen? Es gibt natürlich Two-Way-Datenbindung, aber das Datenmodell hat dafür keinen „Empfänger“. Das Datenmodell entsprechend anzupassen würde eine Abhängigkeit zwischen View und Model erzeugen.
  • #21 Wie aber lassen sich Änderungen aus der UI an das Datenmodell zurückspielen? Es gibt natürlich Two-Way-Datenbindung, aber das Datenmodell hat dafür keinen „Empfänger“. Das Datenmodell entsprechend anzupassen würde eine Abhängigkeit zwischen View und Model erzeugen.
  • #26 https://github.com/HorizonNet/DEMO-Windows8-DataBinding-3(die eben erklärten Konzept anhand von Demo 3 zeigen und erklären)Dann https://github.com/HorizonNet/DEMO-Windows8-DataBinding-4 gemeinsam mit den Teilnehmer live bauen