André Alves de Lima

Talking about Software Development and more…

Utilizando o ViewModelLocator do MVVM Light

Uma das funcionalidades mais legais do MVVM Light Toolkit é o ViewModelLocator. Com ele conseguimos facilmente, como o próprio nome já diz, localizar as ViewModels do nosso projeto para que possamos bindá-las a algum controle. Este artigo é uma pequena introdução a essa feature.

Em projetos que envolvem XAML e a arquitetura MVVM, inevitavelmente acabamos tendo várias ViewModels no mesmo projeto. Por exemplo, imagine uma solução tenha uma tela principal e outras duas telas: uma para gerenciar Produtos e outra para gerenciar Clientes. Nesse cenário, provavelmente você terá pelo menos três ViewModels: MainViewModel, ProdutoViewModel e ClienteViewModel. Até aí tudo bem, mas, a coisa começa a complicar quando queremos fazer o binding entre as telas e as ViewModels. O ViewModelLocator do MVVM Light Toolkit foi criado justamente para ajudar-nos a realizar essa tarefa, além de fazer com que o nosso projeto fique mais organizado.

A ideia é muito simples. Toda e qualquer instância de ViewModel utilizada pela solução será instanciada dentro do ViewModelLocator. E cada tipo de ViewModel será representada por uma propriedade dentro do ViewModelLocator.

Para vermos como isso funciona na prática, crie um projeto que suporte XAML (WPF, Silverlight, Windows Phone, Metro Style App) e adicione uma referência pelo NuGet ao MVVM Light Toolkit (caso não saiba como, confira o artigo “Gerenciando pacotes do NuGet no Visual Studio“). Ao adicionar a referência ao MVVM Light Toolkit pelo NuGet, várias estruturas são criadas automaticamente. Uma delas é a classe ViewModelLocator, que você encontra dentro da pasta ViewModel:

Vamos explorar o conteúdo criado automaticamente nessa classe logo a seguir. Mas, antes disso, gostaria que vocês dessem uma olhada dentro do arquivo App.xaml. Ao conferirmos o conteúdo desse arquivo, podemos notar que o MVVM Light Toolkit já criou uma instância de ViewModelLocator como um Resource. Isso significa que essa instância de ViewModelLocator estará disponível para ser utilizada em qualquer lugar dentro do nosso projeto:

Agora sim, vamos ver o conteúdo da classe ViewModelLocator que foi criada pelo MVVM Light Toolkit:

Como podemos observar, o ViewModelLocator foi implementado de forma a suportar injeção de dependência. Não vou abordar a utilização desse conceito neste artigo (escreverei um próximo no qual detalharei melhor esse assunto), mas, basicamente o que proporciona ao ViewModelLocator é a possibilidade de termos um comportamento para quando estamos em tempo de desenvolvimento e outro para quando estamos em tempo de execução. Isso faz uma diferença brutal ao desenvolvermos a interface com o Blend, já que com isso conseguimos ter um DataSource com dados “dummy” para desenharmos a interface mais facilmente. Mas, como já falei, isso fica para um próximo artigo.

Utilizar o ViewModelLocator sem considerar injeção de dependência é muito simples. Pensando novamente no cenário que comentei anteriormente onde temos três ViewModels (MainViewModel, ProdutoViewModel e ClienteViewModel), precisamos seguir dois passos. O primeiro é, no construtor de ViewModelLocator, registrar os outros dois tipos que ainda não estão registrados (ProdutoViewModel e ClienteViewModel, uma vez que MainViewModel já estava registrado):

            SimpleIoc.Default.Register<ProdutoViewModel>();
            SimpleIoc.Default.Register<ClienteViewModel>();

Em seguida, criar as duas propriedades que vão retornar as instâncias dessas ViewModels:

        public ProdutoViewModel Produto
        {
            get
            {
                return ServiceLocator.Current.GetInstance<ProdutoViewModel>();
            }
        }
        public ClienteViewModel Cliente
        {
            get
            {
                return ServiceLocator.Current.GetInstance<ClienteViewModel>();
            }
        }

Pronto. Com isso já podemos ir até às janelas de Produto e Cliente e fazer o binding. Esse binding utilizará como Source aquele Resource que é a instância de ViewModelLocator declarado em App.xaml, e o Path será o nome da ViewModel que queremos utilizar. Por exemplo, na tela de Produto, configuramos o DataContext da seguinte maneira:

DataContext="{Binding Path=Produto, Source={StaticResource Locator}}"

A ideia é a mesma para a tela de Cliente, mas, ao invés de utilizar “Produto” como path, é só utilizar “Cliente”. Temos até suporte ao IntelliSense no atributo “Path” caso estejamos trabalhando com o Visual Studio 2013 ou superior (aproveite e confira o meu outro artigo “Minhas features favoritas do editor de XAML do Visual Studio 2013“):

Simples, não? Espero que tenham gostado. Como já disse, em um artigo posterior volto a abordar o ViewModelLocator, mas dessa vez utilizando todo o seu potencial através de injeção de dependência.

Até o próximo artigo!

André Lima

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *