22/07/2013

[WindowsPhone] Lecteur de flux : Couche ViewModel

Bonjour à toutes et à tous
Nous allons reprendre notre lecteur de flux rss où nous l'avions laissé et allons nous occuper aujourd'hui de la couche ViewModel.

Dossier complet

  1. [WindowsPhone] Lecteur de flux : Couche Model
  2. [WindowsPhone] Lecteur de flux : Couche ViewModel
  3. [WindowsPhone] Lecteur de flux : Couche View
  4. [WindowsPhone] Lecteur de flux : Le détail du post
  5. [WindowsPhone] Lecteur de flux : LiveTiles, Isolated Storage & BackgroundAgent

Modèle du ViewModel

Donc on va créer notre dossier ViewModel.
Cette fois-ci nous allons créer un modèle qui sera repris par l'ensemble de nos ViewModel. Ce modèle gère la propriété IsBusy de notre ViewModel, l'interface INotifyPropertyChanged et l'événement pour la fin du traitement :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

using System.Runtime.CompilerServices;

namespace MyApp.ViewModel
{
    public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        private bool _isBusy;
        public bool IsBusy
        {
            get { return _isBusy; }
            set
            {
                if (_isBusy != value)
                {
                    _isBusy = value;
                    NotifyPropertyChanged();
                }
            }
        }

        public event EventHandler OnTreatmentCompleted;

        protected void TreatmentCompleted()
        {
            onTreatmentCompleted(this, null);
        }
    }
}

ViewModel des Posts

Ensuite nous créons notre ViewModel qui va gérer une collection d'items, la propriété IsBusy pour indiquer si notre ViewModel est toujours en cours de traitement. Notre méthode d'entrée est bien évidemment la méthode OnNavigatedTo et on s'abonne à l'événement de notre BloggerService. Lorsque le traitement est terminé, nous récupérons les data et on signale que le traitement est terminé :

using MyApp.Model.ModeleClient;
using MyApp.Model.Services;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace MyApp.ViewModel
{
    public class PostsViewModel : ViewModelBase
    {

        private ObservableCollection _myBlogPosts = new ObservableCollection();
        public ObservableCollection MyBlogPosts
        {
            get
            {
                return _myBlogPosts;
            }
            set
            {
                if (_myBlogPosts != value)
                {
                    _myBlogPosts = value;
                    NotifyPropertyChanged();
                }
            }

        }

        BloggerService BloggerSvc;

        public void OnNavigatedTo()
        {
            IsBusy = true;
            BloggerSvc = new BloggerService();
            BloggerSvc.LoadAsyncComplete += BloggerSvc_LoadAsyncComplete;
            BloggerSvc.LoadData();
        }

        void BloggerSvc_LoadAsyncComplete(object sender, EventArgs e)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                MyBlogPosts = BloggerSvc.PostData;
                IsBusy = false;
                TreatmentCompleted();
            });
        }
    }
}

BONUS : ViewModelLocator

Dans le cadre de notre application, il n'est pas forcément nécessaire de créer un ViewModelLocator car nous n'avons qu'un seul ViewModel. Mais cela deviendra utile dès que nous en aurons plusieurs. Notre ViewModelLocator va nous permettre d'accéder à l'ensemble de nos ViewModel côté XAML sans changer de DataContext

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using MyApp.Resources;
using MyApp.Model;
using System.Net;
using System.Windows;
using System.IO;
using System.Xml;
using System.Linq;
using System.Xml.Linq;
using System.IO.IsolatedStorage;
using LGDL.WP8.Model.ModeleClient;
using Microsoft.Phone.Net.NetworkInformation;

namespace MyApp.ViewModel
{
    public class ViewModelLocator : ViewModelBase
    {
        public PostsViewModel PostsViewModel { get; set; }

        public ViewModelLocator()
        {
            PostsViewModel = new PostsViewModel();

            PostsViewModel.OnTreatmentCompleted += ViewModel_OnTreatmentCompleted;
        }

        void ViewModel_OnTreatmentCompleted(object sender, EventArgs e)
        {
            IsBusy = false;
        }

        public void OnNavigatedTo()
        {
            IsBusy = true;
            PostsViewModel.OnNavigatedTo();
        }
    }
}

Conclusion

Bon voilà, notre couche, vous pouvez retrouver les sources ici
La vidéo :


A vendredi pour un prochain article et à lundi prochain pour la suite.

Aucun commentaire:

Enregistrer un commentaire