5
respostas

erro ao preencher o label com binding

Boa tarde, estou com um erro ao fazer o binding do label com o nome do bairro. O erro é : [0:] Binding: 'Bairro' property not found on 'SalveMaria.Pages.DenunciaPage2', target property: 'Xamarin.Forms.Label.Text'

Código XAML:

<cv:CarouselView x:Name="carouselFoto">
                    <cv:CarouselView.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <StackLayout Grid.Row="1">
                                    <Label Text="{Binding Bairro}" TextColor="White" FontSize="20" 
                                           HorizontalOptions="Center" VerticalOptions="CenterAndExpand"/>
                                </StackLayout>
                            </Grid>
                        </DataTemplate>
                    </cv:CarouselView.ItemTemplate>
                </cv:CarouselView>

Code Behind:

public partial class DenunciaPage2 : ContentPage
    {
        List<string> _cidades = new List<string>();
        public List<Bairros> bairros { get; set; }
        CidadesBairros listaCidades;


        public DenunciaPage2()
        {
            InitializeComponent();
            this.bairros = new PopulaBairro().bairros;
            listaCidades = new CidadesBairros();
            _cidades = listaCidades.LoadCidades();
            pickerCidade.ItemsSource = _cidades;
            dataDenuncia.Date = DateTime.Now;
            horaDenuncia.Time = DateTime.Now.TimeOfDay;
            carouselFoto.ItemsSource = bairros;
            this.BindingContext = this;

        }
    }

Classe Model:

public class Bairros
    {
        public string Cidades { get; set; }
        public string Bairro { get; set; }
    }

Classe para preencher a lista de bairros:

 public class PopulaBairro
    {
        public List<Bairros> bairros { get; set; }

        public PopulaBairro()
        {
            this.bairros = new List<Bairros>
            {
                new Bairros
                {
                    Bairro = "Vinhais",
                    Cidades = "São Luís"
                },
                new Bairros
                {
                    Bairro = "Centro",
                    Cidades = "São Luís"
                },
                new Bairros
                {
                    Bairro = "Raposa",
                    Cidades = "Raposa"
                }
            };
        }

    }
5 respostas

Oi João Carlos, tudo bem?

Você precisa especificar o ItemsSource no CarroselView:

<cv:CarouselView x:Name="carouselFoto" ItemsSource="{Binding bairros}>

Sem definir o ItemsSource, o Xamarin irá procurar a propriedade Bairro na própria DenunciaPage2, onde o Bairro não existe.

Bom dia, mesmo realizando os passos da vídeo aula, onde realiza o binding apenas pelo xaml, os campos ainda ficam em branco, retirei o carrouselview e utilizei um picker, porem não adiantou.

Classe para preencher a lista de bairros:

public class PopulaBairro
    {
        public ObservableCollection<Bairros> bairros { get; set; }

        public PopulaBairro()
        {
            this.bairros = new ObservableCollection<Bairros>
            {
                new Bairros { Cidade = "São Luís", Nome = "Abdon Braide" },
                 new Bairros { Cidade = "São Luís", Nome = "Alameda Dos Sonhos" },
                 new Bairros { Cidade = "São Luís", Nome = "Albino Soeiro" }
                }
            };
        }
    }

Xaml:

<salvemaria:CardView CornerRadius="20">
                    <Picker x:Name="pickerBairro" Title="Bairro *" TextColor="#810032" 
                            VerticalOptions="CenterAndExpand" SelectedIndexChanged="OnPickerBairroSelectedIndexChanged"
                            ItemsSource="{Binding bairros}" ItemDisplayBinding="{Binding nome}"/>
                </salvemaria:CardView>

ViewModel:

public class BairroViewModel
    {
        public ObservableCollection<Bairros> bairros { get; set; }
        public List<Cidades> cidades { get; set; }

        public DenunciaViewModel()
        {
            this.cidades = new PopulaListas().cidades;
            this.bairros = new PopulaListas().bairros;
        }
    }

sendo que foi adicionado já o <ContentPage.Binding> no meu xaml

na linha

this.cidades = new PopulaListas().cidades;

quando uso o break point e coloco o mouse em cima de ".cidades" ele mostra a lista de cidades, porem quando abro as listas e tento ver os atributos aparece apenas "non-public members" enquanto nas vídeo aulas aparecem que os atributos da classe, porem os atributos da classe cidades estão como públicos.

João, você pode postar aqui a classe Cidades? Pra darmos uma olhada? Ah, se cada objeto representa uma única cidade, recomendo mudar para "Cidade", no singular, para não confundir com uma lista de cidades.

Já alterei ela nessa situação de estar no plural, mas esse problema ocorre em qualquer um binding que eu tente fazer classe Cidade

public class Cidade
    {
        public long id { set; get; }
        public string nome { set; get; }
    }

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