Blog do MX Cursos

Navigation e Messaging com Xamarin.Forms PageContext

Avaliar post

Oi pessoal do MX Cursos, hoje vamos falar de PageContext, alguém já ouviu falar ? Não? Então, este foi um termo que utilizei já que estaremos tratando no próprio contexto das Pages no Xamarin.Forms e o nome parece ser bem fiel…

Em um rápido preview apresentaremos um diagrama simples para esboçar um projeto cujo sua camada de apresentação esteja sob o pattern MVVM ( Model-View-Viewmodel – intrínseco ao Xamarin ).

http://rehansaeed.com/tag/windows-phone/

View – Responsável por definir a estrutura, layout e aparência do que os usuários veem na tela. As definições das views podem ser feitas tanto em XAML ou Code API, com um code-behind sem lógicas de negócio e definições de eventos para os objetos visuais (utilizando XAML, teríamos somente a chamada do método InitializeComponent e no Code API, a instanciação e inicialização dos objetos visuais, e à conexão entre a View e a ViewModel através da propriedade de BindingContext, ….)

 Viewmodel –  Atua como um intermédio entre a view e a model, e é responsável por manipular a lógica de negócio. A viewmodel recupera e disponibiliza dados da model de forma que a view possa facilmente manipulá-los, esta por sua vez fornece Commands que um usuário da aplicação inicia na view.

 Model – A model no MVVM é uma implementação do domínio da aplicação que incluem modelo de dados juntos com o negócio e lógica de validação. Exemplos de modelo de objetos incluem repositories, objetos de negócio, DTO (Data Transfer Objects ), POCOs (  Plain Old CLR Objects ), entidades e objetos proxy.

Agora com as definições compreendidas, vamos fluir na construção da nossa Sample Application ( Estamos utilizando o Visual Studio Community 2015 – ( Sensacional ) ).

Crie um novo projeto em Cross-Platform selecionando o ItemTemplate Blank App ( à escolha da abordagem Shared ou Portable fica por sua conta…. ).

Com o projeto gerado a nossa Solution ficará da seguinte forma.

Fazendo um rápido entendimento sobre o que será o  helper PageContext,  sabemos que o modelo de navegão utilizado no Xamarin.Forms se basea na interface INavigation membro da classe VisualElement e as mensagens pop-ups ( o Xamarin.Forms as implementa nativamente em cada plataforma ) através dos métodos DisplayAlert() e DisplayActionSheet presentes na classe Page. De certa forma poderíamos utilizar estes elementos através do Code-Behind das nossas classes que representam as Pages da nossa aplicação, já que os mesmos estão presentes nas classes ancestrais; mas, como a intenção é utilizar o modelo MVVM e como dito anteriormente que as Views se conectam às ViewModels através da propriedade BindingContext ( membro da classe BindableObject ), não faremos chamadas aos métodos de navegação ou mensagens, pois os objetos visuais utilizarão o mecanismo de DataBinding com Commands para designar tais ações. Os commands são membros da ViewModel, e esta por sua vez não possui ou não deve ter referências às Pages ( como por exemplo manipular seus objetos visuais), assim mantemos as responsabilidades das ViewModels bem definidas. Tudo soa bastante interessante, mas vai uma pergunta, como não utilizaremos Code-Behind e as ViewModels por não conhecerem as Pages, como utilizaremos a Navegação ou Mensagens em nossa aplicação ? Neste ponto entra o PageContext, que garantirá a independência entre as Views e ViewModels, utilizando Injeção de Dependência para executar a navegação e mensagens. Como resultado final nossa aplicação ficará da seguinte forma:

Windows Phone:

Android:

iOS:

Vamos utilizar em nosso exemplo o contâiner de IoC conhecido com Autofac (http://autofac.org/  ), para isto, utilize a opção Manage Nuget Packages, ou através do menu Tools -> Nuget Package Manager -> Package Manager Console.

Após a adição do package, vamos iniciar com a criação de nossas Pages, a abordagem utilizada será XAML. Por uma escolha pessoal gosto sempre de separar as classes em folders para que fiquem mais legíveis à solution.

Expandindo a folder Pages, obtemos os seguintes arquivos:

A folder Context, examinaremos com mais detalhes um pouco mais adiante, já a folder Interfaces contêm as interfaces que nossas Pages implementarão e que serão registradas em nosso container.

A interface IPage apresenta alguns membros como propriedade e métodos que as próprias Pages do Xamarin já implementam, estes por sua vez são os membros necessários que precisamos para as chamadas em nosso PageContext.

Estas são as demais interfaces da folder Pages/Interfaces que serão utilizadas em nosso container. Na estrutura das XAML Pages, temos:

Agora que nossas Pages estão construídas, vamos visualizar as viewmodels que se encontram na seguinte estrutura:

Lembrando que para que haja uma viewmodel a mesma deve implementar a interface INotifyPropertyChanged , para que a mesma possa responder às notificações; para evitar o retrabalho a ViewModelBase se encarrega desta implementação.

Seguindo com as demais:

Podemos observar que as viewmodels não possuem instancias das Pages, temos somente uma propriedade chamada PageContext que é setada por injeção do container. Desta forma temos o PageContext apresentado na seguinte estrutura:

A interface IPageContext expõe os membros para Navigation e Messaging:

E sua implementação:

Vamos detalhar nossa PageContext:

  • A propriedade de CurrentPage retorna a IPage atual;
  • O construtor da classe PageContext, recebe IComponentContext, que é o própria instância do container, para que possamos recuperar as implementações tardiamente, e recebemos também uma IPage que é inserida como a primeira página da Stack de navegação.
  • Nos métodos de navegação recebemos nos placeholders uma page (TPage) e uma viewmodel (TViewmodel), ambas são referências para as instâncias recuperadas no container, as conectamos pelo BindingContext da Page e em seguida utilizamos o sistema de Navegação do Xamarin.Forms;
  • O método SetPropertyValue é utilizado para setarmos uma propriedade da viewmodel.
  • Por final temos os métodos de Messaging que são um wrapper para os métodos utilizados no Xamarin.Forms que estão presentes dentro de Page.

Desta forma em nossas implementações nas viewmodels temos o Context chamando o método de NavigateTo passando a interface da Page e Viewmodel, que serão resolvidas pelo container e o método ShowMessage para apresentação das mensagens.

Antes de finalizarmos vamos à configuração do nosso container.

O método GetPage nos auxilia na inicialização do PageContext e definir à Page de inicialização na classe Application.

Lembre-se de inicializar a configuração do container.

Este helper não contempla todas as possíveis chamadas e navegação do Xamarin.Forms, mas para isso basta implementá-los de acordo com à necessidade. A utilização do PageContext é interessante pois inibe a utilização da Page e seus membros, o que poderia deixar as viewmodels completamente amarradas. Espero que curtam PageContext, saudações MXCursos !

Your Header Sidebar area is currently empty. Hurry up and add some widgets.

Newsletter

Newsletter

Receba em seu e-mail conteúdos semanais sobre desenvolvimento, design, audiovisual e tecnlogia.

Inscrição realizada com sucesso!