Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Enviar uma lista de itens para uma view - Xamarin

Olá Pessoal,

Estou com o seguinte problema, estou tentando enviar uma lista de itens obtidos através de web service para uma View. A ideia é essa lista de itens alimentarem um com alguns dados. O código atual esta da seguinte maneira:

Este é o ViewCode :

public partial class BuscaCidadeDestinoView : ContentPage
    {
        public BuscaCidadeDestinoViewModel ViewModel { get; set; }

        public BuscaCidadeDestinoView ()
        {
            InitializeComponent();

            ViewModel = new BuscaCidadeDestinoViewModel();

            this.BindingContext = this.ViewModel;
        }

        protected async override void OnAppearing()
        {
            base.OnAppearing();

            await this.ViewModel.GetCidades();

            //verifica se ocorreu tudo bem na listagem de cidades
            MessagingCenter.Subscribe<Exception>(this, "FalhaListagem",
                (msg) =>
                {
                    DisplayAlert("Erro", "Ocorreu um erro ao obter a listagem ", "Ok");
                });
        }

        protected override void OnDisappearing()
        {
            base.OnDisappearing();

            MessagingCenter.Unsubscribe<String>(this, "CidadeDestino");
        }
    }
}

e esta é a ViewModel:

public class BuscaCidadeDestinoViewModel : BaseViewModel
    {
        private string buscaCidadeDestino;

        //lista de linhas por empresa
        const string URL_CIDADES = "Url que estou usando para acessar web service";

        public System.Collections.ObjectModel.ObservableCollection<CidadeDestino> ListaCidades { get; set; }

        public List<string> cidades;

        public ICommand BuscaPartidasCommand { get; set; }

        public BuscaCidadeDestinoViewModel()
        {

            this.ListaCidades = new System.Collections.ObjectModel.ObservableCollection<CidadeDestino>();

            this.BuscaPartidasCommand = new Command(() =>
            {
                MessagingCenter.Send<String>(this.BuscaCidadeDestino, "CidadeDestino");

                //instrução lambda para não permitir o envio de formulário com dados em branco
            }, () =>
            {
                return !string.IsNullOrEmpty(this.BuscaCidadeDestino);
            });
        }

        private bool aguarde;
        public bool Aguarde
        {
            get { return aguarde; }
            set
            {
                aguarde = value;
                OnPropertyChanged();
            }
        }

        class CidadeJson
        {

            public string Ds_Cidade_Destino { get; set; }

        }
       //metodo para pegar dados de um webservice
        public async Task GetCidades() 
        {
            Aguarde = true;
            try
            {
                //abre uma conexão do tipo Http
                HttpClient cliente = new HttpClient();
                //retorna uma string "GetStringAsync" e é armazenada na variavel resultado
                var resultado = await cliente.GetStringAsync(URL_CIDADES);
                //"Divide" a string recebida em diversos objetos e armazena na variavel cidadeJson
                var cidadeJson = JsonConvert.DeserializeObject<CidadeJson[]>(resultado);

                foreach (var cidade in cidadeJson)
                {
                    this.ListaCidades.Add(new CidadeDestino
                    {
                        DsCidadeDestino = cidade.Ds_Cidade_Destino                    
                    });
                }

                foreach(var destino in ListaCidades)
                {
                    this.cidades = new List<string>();
                    cidades.Add(destino.DsCidadeDestino);         
                }

                Aguarde = false;

            }
            catch (Exception e)
            {
                MessagingCenter.Send<Exception>(e, "FalhaListagem");
            }
        }

Agradeço desde já a quem puder ajudar.

atenciosamente.

2 respostas

Esqueci de colocar a View:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="AppRDVAUX.Views.BuscaCidadeDestinoView"
             Title="Busca por Destino">
    <ContentPage.Content>

        <StackLayout VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
            <!--Combobox-->
            <Label FontAttributes="Bold" FontSize="Medium">Selecione a Origem:</Label>
            <Picker  ItemsSource="{Binding cidades}"/>

            <Label FontAttributes="Bold" FontSize="Medium">Selecione o Destino:</Label>
            <Picker  ItemsSource="{Binding cidades}"/>

            <Button Text="buscar" Command="{Binding BuscaPartidasCommand}"></Button>
        </StackLayout>

    </ContentPage.Content>
</ContentPage>
solução!

Olá, Wesley

Um problema que vejo de cara é que você está usando uma List<string> para sua lista de cidades.

public List<string> cidades;

O correto é utilizar um ObservableCollection<string>, pois assim o controle será atualizado automaticamente quando o ObservableCollection mudar:

public ObservableCollection<string> cidades;

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software