Créer votre première application Windows Phone 7 en MVVM.
Le but de ce tutoriel est de créer un mini client Twitter avec le pattern MVVM, on va faire exactement le même client twitter que Scott Guthrie a fait pendant la présentation MIX 10 sauf qu’on va le faire en MVVM.
Pourquoi MVVM ?
MVVM est un pattern qui facilite les tests de code et les taches des développeurs et designers comme il n’y’a pas de « code behind » dans le vues.
Voici un schéma résumant le pattern :

Pour développer sur Windows Phone 7, vous devez télécharger le SDK qui est gratuit [ici]. La version en ligne maintenant est la Beta.
Pour commencer on va utiliser le template que nous avons mis à disposition sur Visual Studio Gallery qui nous permet de gagner du temps.

Vous remarquerez que :
Les répertoires «ViewModel » / « Views » / «Model » sont déjà crées  et Les fichiers MainViewModel.cs / ViewModelBase.cs aussi déjà crées.
Attaquons le Model et ajoutons une classe « Tweet »
Ajouter la référence : System.Xml.Linq qui va nous faciliter le parçage XML

Ajoutez aussi dans la classe «Tweet » les 2 namespaces :
- System.Xml.Linq
- System.Linq
Ajoutez les propriétés dont on a besoin : Username, Message, ImageSource (tous de type string) et la méthode statique qui va parser le résultat xml.
{
List<Tweet> lstTweets = new List<Tweet>();
XElement xmlTweets = XElement.Parse(Response);
lstTweets = (from tweet in xmlTweets.Descendants(« status« )
select new Tweet
{
ImageSource = tweet.Element(« user« ).Element(« profile_image_url« ).Value,
Message = tweet.Element(« text« ).Value,
Username = tweet.Element(« user« ).Element(« screen_name« ).Value
}).ToList();
ObservableCollection<Tweet> obsTweets = new ObservableCollection<Tweet>();
foreach (Tweet t in lstTweets)
obsTweets.Add(t); return obsTweets;
Maintenant on peut procéder au ViewModel:
Ajoutez la propriété de type ObservableCollection<Tweet> :
public ObservableCollection<Tweet> LstTweets
{
get { return lstTweets; }
set
{
if (lstTweets != value)
{
lstTweets = value;
OnNotifyPropertyChanged(LstTweetsPropertyName);
}
}
}
public const string LstTweetsPropertyName = « LstTweets« ;
Ajoutez ces méthodes qui permettent l’appel plus la response de l’API Twitter:
{
WebClient client = new WebClient();
client.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler(twitter_Response);
client.DownloadStringAsync(
new Uri(« http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=«
+ screenName));
}
private void twitter_Response(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
LstTweets = Tweet.GetTweetsFromResponse(e.Result);
}
}
C’est avec un bouton qu’ on va exécuter commande, sauf que les commandes n’existaient pas en Silverlight 3 , et comme WP7 c’est du Silverlight 3 on va utiliser le toolkit MVVM Light pour faciliter notre tache.
Donc téléchargez les .dll d’ici et ajoutez « GalaSoft.MvvmLight.WP7 » comme référence.
Apres avoir fait ca retournons au MainViewModel  pour ajouter notre RelayCommand :
{
GetTweetsCall(param);
});
Et on appellera la méthode GetTweetsCall à chaque fois que la commande est exécutée.
Donc votre MainViewModel doit ressembler à ca maintenant :
Les proprietés :
public ObservableCollection<Tweet> LstTweets
{
get { return lstTweets; }
set
{
if (lstTweets != value)
{
lstTweets = value;
OnNotifyPropertyChanged(LstTweetsPropertyName);
}
}
}
public const string LstTweetsPropertyName = « LstTweets« ;
public RelayCommand<string> MyCommand { get; set; }
Le constructeur:
{
MyCommand = new RelayCommand<string>( param =>
{
GetTweetsCall(param);
});
}
Les méthodes:
{
WebClient client = new WebClient();
client.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler(twitter_Response);
client.DownloadStringAsync(
new Uri(« http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=«
+ screenName));
}
private void twitter_Response(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
LstTweets = Tweet.GetTweetsFromResponse(e.Result);
}
}
Passons à la vue!
Dans le premier pivotitem ajoutons un textbox, un bouton et une listbox.
Ajoutez le namespace pour la commande a travers MVVM Light toolkit : xmlns:cmd= »clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.WP7″
Liez la commande au bouton et le paramètre de la commande avec en binding la propriété «Text » du TextBox ajouté:
<Button Content= »{Binding Lookup, Source={StaticResource HomeResourceStrings}} »
cmd:ButtonBaseExtensions.Command= »{Binding MyCommand} »
cmd:ButtonBaseExtensions.CommandParameter= »{Binding Text, ElementName=txtUser} »
Width= »215″></Button>
Et enfin créer une listbox ou l’ItemTemplate contiendra une image et 2 textbox (une pour le username et l’autre pour le message).
Pour avoir quelque chose qui ressemble à ca dans votre PivotItem :
<StackPanel Orientation= »Horizontal »>
<TextBox x:Name= »txtUser » Width= »250″ Height= »70″></TextBox>
<Button Content= »{Binding Lookup, Source={StaticResource HomeResourceStrings}} » cmd:ButtonBaseExtensions.Command= »{Binding MyCommand} » cmd:ButtonBaseExtensions.CommandParameter= »{Binding Text, ElementName=txtUser} » Width= »215″></Button>
</StackPanel>
<ListBox Height= »500″ HorizontalAlignment= »Left »
VerticalAlignment= »Top »
Width= »440″ ItemsSource= »{Binding LstTweets, Mode=OneWay} »>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation= »Horizontal »>
<Image Height= »100″ Width= »100″ Source= »{Binding ImageSource , Mode=OneWay} »
VerticalAlignment= »Top » Margin= »0,10,8,0″/>
<StackPanel Orientation= »Vertical »>
<TextBlock Text= »{Binding Username , Mode=OneWay} » />
<TextBlock Text= »{Binding Message , Mode=OneWay} » />
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Vous pouvez tout à fait aussi mettre tout ca dans un User control à part et l’inclure dans le PivotItem ici en bindant le DataContext.
Lancez l’application :

































subscribe to comments RSS
Pas de commentaire pour cet article