Overblog Suivre ce blog
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

Repost 0
Published by Romagny13 - dans Prism for WinRT
commenter cet article
6 mai 2014 2 06 /05 /mai /2014 15:07

Je reprends le même exemple vu dans l'article précédent auquel j'ajoute un ViewModel contenant une propriété message que la vue associée affichera

 

Convention :

Pourquoi respecter cette convention ? parce que sinon Prism ne retrouvera pas ses petits icon_surprised.gif

 

-          Les Views sont dans un dossier « Views »

o   avec le namespace « *.Views »

o   et un nom de vue se terminant par « Page » (exemple HubPage)

-          Les ViewModels sont dans un dossier « ViewModels »

o   avec le namespace « *.ViewModels »

o   et un nom finissant par « ViewModel »

 

ViewModel

Je me contenterai d’afficher le message  dans la vue associée

    // ViewModel --> Microsoft.Practices.Prism.StoreApps 

    public class HelloViewModel :ViewModel 

    {

        public string Message { get; set; }

 

        public HelloViewModel()

        {

            Message = "Hello world";

        }

    }

 

App.xaml.cs

    sealed partial class App : MvvmAppBase 

    {

        public App()

        {

            this.InitializeComponent();

        }

 

        protected override Task OnLaunchApplication(LaunchActivatedEventArgs args)

        {

           NavigationService.Navigate("Hub", null);

           Window.Current.Activate();

           return Task.FromResult<object>(null);

        }

 

        protected override void OnInitialize(IActivatedEventArgs args)

        {

            base.OnInitialize(args);

          

 

            // 1 

            //ViewModelLocator.SetDefaultViewTypeToViewModelTypeResolver((viewType) => 

            //    {

            //        if (viewType == typeof(HubPage))

            //            return typeof(HelloViewModel);

            //        else

            //            return null;

            //    });

 

            // 2 Autre possibilité

            ViewModelLocator.Register(typeof(HubPage).ToString(),()=> new HelloViewModel());

 

            ViewModelLocator.SetDefaultViewModelFactory((viewModelType) =>

                {

                    return Activator.CreateInstance(viewModelType);

                });  

        }

    }

 

HubPage

Ne pas oublier d’ajouter dans la vue

Prism:ViewModelLocator.AutoWireViewModel="True"


<Prism:VisualStateAwarePage 

    x:Name="pageRoot" 

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

    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:common="using:Shop.PrismWinRT.Common"

    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">

 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

        <Grid.ChildrenTransitions>

            <TransitionCollection>

                <EntranceThemeTransition/>

            </TransitionCollection>

        </Grid.ChildrenTransitions>

        <Grid.RowDefinitions>

            <RowDefinition Height="140"/>

            <RowDefinition Height="140"/>

            <RowDefinition Height="*"/>

        </Grid.RowDefinitions>

 

        <Grid>

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="120"/>

                <ColumnDefinition Width="*"/>

            </Grid.ColumnDefinitions>

              <TextBlock x:Name="pageTitle"

                         Text="{StaticResource AppName}"

                         Style="{StaticResource HeaderTextBlockStyle}"

                         Grid.Column="1"

                         IsHitTestVisible="false"

                         TextWrapping="NoWrap"

                         VerticalAlignment="Bottom"

                         Margin="0,0,30,40"/>

        </Grid>

        <TextBlock Text="{Binding Message}"

                   Style="{StaticResource BodyTextBlockStyle}"

                   Grid.Row="1" Margin="150,40"

                  

                   />

 

    </Grid>

</Prism:VisualStateAwarePage>

 

 

helloprismwinrt

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