Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

12 mai 2014 1 12 /05 /mai /2014 21:54

 

unitywinrt1.png

 

Important

Pourquoi respecter ses conventions ? Parce que ça vous évitera de chercher pourquoi ça ne marche pas icon_surprised.gif:

Les Views sont dans un dossier « Views »

  •          avec le namespace « *.Views »
  •          et un nom de vue se terminant par « Page » (exemple MainPage)

Les ViewModels sont dans un dossier « ViewModels »

  •           avec le namespace « *.ViewModels »
  •           Le nom du ViewModel doit correspondre au nom de la vue

Exemple la vue MainPage a pour ViewModel MainPageViewModel .Pour la navigation on appelera « Main »

-          Attention aussi à ne pas avoir plusieurs constructeurs avec le même nombre de paramètres

 unitywinrt2.png


Pour rappel

  • La page de démarrage App.xaml hérite de MvvmAppBase
  • Les vues(Views) sont des VisualStateAwarePage
  • Les ViewModels héritent de ViewModel (Microsoft.Practices.Prism.StoreApps)

 

Ajouter aux pages Prism:ViewModelLocator.AutoWireViewModel="True"

Exemple

<Prism:VisualStateAwarePage

    x:Class="Shop.PrismWinRT.Views.ArticlePage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:local="using:Shop.PrismWinRT.Views"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:Prism="using:Microsoft.Practices.Prism.StoreApps"

    Prism:ViewModelLocator.AutoWireViewModel="True"

    mc:Ignorable="d">

    <!-- etc. -->

  

App.xaml.cs

Ici on enregistre une instance(comme un singleton) de NavigationService

    sealed partial class App : MvvmAppBase

    {

        private IUnityContainer container = new UnityContainer();

 

        public App()

        {

            this.InitializeComponent();

        }

 

        protected override Task OnLaunchApplication(LaunchActivatedEventArgs args)

        {

            NavigationService.Navigate("Main", null);

            Window.Current.Activate();

            return Task.FromResult<object>(null);

        }

 

        protected override void OnInitialize(IActivatedEventArgs args)

        {           

            container.RegisterInstance<INavigationService>(NavigationService);

 

            ViewModelLocator.SetDefaultViewModelFactory((viewModelType) =>

            {

                return container.Resolve(viewModelType);

            });

        }  

    }

 

 

 

D’autres exemples d’enregistrement (enregistrement de repository et SessionStateService) :

container.RegisterInstance<ISessionStateService>(SessionStateService);

container.RegisterType<IArticleRepository, ArticleRepository>(new ContainerControlledLifetimeManager());


ViewModel MainPageViewModel associé à MainPage.xaml

public class MainPageViewModel :ViewModel

    {

        public ObservableCollection<ArticlePageViewModel> Items { get; set; }

 

        private ArticlePageViewModel _currentItem;

 

        public ArticlePageViewModel CurrentItem

        {

            get { return _currentItem; }

            set

            {

                _currentItem = value;

                OnPropertyChanged("CurrentItem");

            }

        }

        public DelegateCommand<ArticlePageViewModel> DetailArticleCommand { get; private set; }

        private INavigationService navigationService;

        private IArticleRepository articleRepository;

 

        public MainPageViewModel(INavigationService navigationService)

        {

            this.navigationService = navigationService;

            DetailArticleCommand = new DelegateCommand<ArticlePageViewModel>(vm => navigationService.Navigate("Article", vm));

            GetAll();

        }

       

        public async void GetAll()

        {

            articleRepository = new ArticleRepository();

            IList<ArticleModel> articles = await articleRepository.GetAllAsync();

            Items = new ObservableCollection<ArticlePageViewModel>();

            foreach (ArticleModel article in articles)

                Items.Add(new ArticlePageViewModel(navigationService, article));

 

            OnPropertyChanged("Items");

        }

    }

On appelle la page ArticlePage(et passage de paramètre ,ici le viewmodel courant)  avec navigationService.Navigate("Article", vm)


ViewModel ArticlePageViewModel(permettant d’afficher le détail d’un article) associé à ArticlePage.xaml

  public class ArticlePageViewModel : ViewModel 

    {

        private ArticleModel _article;

 

        public ArticleModel Article

        {

            get { return _article; }

            set

            {

                _article = value;

                OnPropertyChanged("Article");

            }

        }

 

        private INavigationService navigationService;

        public DelegateCommand GoBackCommand { get; private set; }

 

        public ArticlePageViewModel(INavigationService navigationService, ArticleModel article)

        {

            this.navigationService = navigationService;

            this.Article = article;

 

            GoBackCommand = new DelegateCommand(() =>

            {

                if (navigationService.CanGoBack())

                    navigationService.GoBack();

            });

        }

 

        public override void OnNavigatedTo(object navigationParameter,

                                            NavigationMode navigationMode,

                                            Dictionary<string, object> viewModelState)

        {

            this.Article = ((ArticlePageViewModel)navigationParameter).Article;

        }

    }

 

Ressources

http://msdn.microsoft.com/fr-fr/library/windows/apps/xx130638.aspx

Partager cet article

Repost 0
Published by Romagny13 - dans Prism for WinRT
commenter cet article

commentaires