5
respostas

Xamarin Forms MVVM Binding Listview

Quero criar uma listagem de usuários, porém, não estou conseguindo realizar o binding, os dados não são exibidos. Segue minha estrutura:

ListUsuarios.xaml:

<?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="E_Tools.View.ListUsuario">

    <StackLayout Orientation="Vertical" Padding="20">
        <ListView x:Name="lstView" ItemsSource="{Binding Usuarios}" BackgroundColor="White">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextCell
                        Text="{Binding Nome}"
                        Detail="{Binding Apelido}"
                    />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

ListUsuarios.cs

using E_Tools.ViewModel;
using Xamarin.Forms;

namespace E_Tools.View
{
    //[XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ListUsuario : ContentPage
    {
        public ListUsuario()
        {
            InitializeComponent();

            ToolbarItem itemUsuario = new ToolbarItem
            {
                Text = "Novo",
                Order = ToolbarItemOrder.Primary,
                Command = new Command(() => Navigation.PushAsync(new Usuario()))
            };

            ToolbarItems.Add(itemUsuario);

            BindingContext = new ListagemUsuarioViewModel();
        }
    }
}

ListagemUsuarioViewModel.cs:

using E_Tools.Model;
using E_Tools.Repository;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Xamarin.Forms;

namespace E_Tools.ViewModel
{
    public class ListagemUsuarioViewModel : INotifyPropertyChanged
    {
        ObservableCollection<Usuario> Usuarios { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        public ListagemUsuarioViewModel()
        {
            ICollection<Usuario> lstUsuarios = new UsuarioRepository<Usuario>().GetAll();

            Usuarios = new ObservableCollection<Usuario>();

            foreach (var item in lstUsuarios)
            {
                this.Usuarios.Add(item);
            }
        }

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
5 respostas

Olá, Fabiano

Como está sua classe Usuario? Pode postar aqui para darmos uma olhada?

Olá Marcelo,

Segue a classe Usuario.

Usuario.cs

using E_Tools.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace E_Tools.Model
{
    class Usuario : Entity
    {
        public Guid Id { get; set; }

        public string Nome { get; set; }

        public string Apelido { get; set; }

        public string Email { get; set; }

        public string Senha { get; set; }

        public DateTime DataNascimento { get; set; }

        public int Cpf { get; set; }

        public int Cnpj { get; set; }

        public int NivelUsuario { get; set; }

        public int Situacao { get; set; }
    }
}

Olá, Fabiano

Respondi neste outro link: https://cursos.alura.com.br/forum/topico-xamarin-forms-mvvm-binding-listview-50471

Fabiano, mude a visibilidade da sua classe Usuario para public:

public class Usuario : Entity

Do jeito que está, sua classe Usuario é privada. Mas o Xamarin não acusa nenhum erro quando a fonte de dados é privada (infelizmente).

Obrigado Marcelo Oliveira.