2
respostas

Usando SwitchCell com NotifyPropertyChanged

Olá pessoal, já acabei o curso e estou brincando um pouco com o xamarin. Meu problema é que preciso pegar o valor de uma SwitchCell para atualizar um campo no banco, o problema é que quando mudo o valor do componente nada acontece. Se alguém puder me ajudar agradeço. (Já dei uma googleada mas não consegui). Segue o código.

ViewModel

namespace FutApp.ViewModel
{
    public class ListaPlayerViewModel : INotifyPropertyChanged
    { 

        private PlayerDAO dao;
        private ContentPage page;
        public ObservableCollection<Player> Player { get; set; } 

        public ICommand UpdatePlayer { get; private set; }

        public event PropertyChangedEventHandler PropertyChanged;

        private string name;

        public string Name
        {
            get { return name; }
            set
            {
                name = value;
            }
        }

        private bool status;

        public bool Status
        {
            get { return status; }
            set
            {
                if (value != status)
                {
                    status = value;
                    OnPropertyChanged("Status");
                }
            }
        }

        public ListaPlayerViewModel(PlayerDAO dao, ContentPage page)
        {
            Player = dao.Lista;
            this.dao = dao;
            this.page = page;


        private void OnPropertyChanged(string nome)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(nome));
        }
    }
}

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="FutApp.View.ListaPlayer" Title="Jogadores">
  <ContentPage.Content>
    <StackLayout Padding="25">
      <ListView ItemsSource="{Binding Player}">
        <ListView.ItemTemplate>
          <DataTemplate>
            <SwitchCell Text="{Binding Name}" On="{Binding Status, Mode=TwoWay}">
            </SwitchCell>
          </DataTemplate>
        </ListView.ItemTemplate>
      </ListView>
    </StackLayout>
  </ContentPage.Content>
</ContentPage>

xaml behind

namespace FutApp.View
{
    public partial class ListaPlayer : ContentPage
    {
        private ListaPlayerViewModel vm;
        public ListaPlayer(PlayerDAO dao)
        {
            vm = new ListaPlayerViewModel(dao, this);
            this.BindingContext = vm;
            InitializeComponent();
        }
    }
}
2 respostas

Olá, Marcelo!

1) Primeiro, eu aconselho você a mudar o nome da coleção de jogadores do ViewModel para o plural: Players ou Jogadores. Do jeito que está, "Player" é confuso e dá a impressão de se referir a apenas um jogador. E é preciso renomear também no Xaml, pois ele não muda sozinho.

2) O motivo do Status não estar sendo atualizado é que o Xamarin espera que essa propriedade Status esteja dentro da classe Player, e não diretamente na ViewModel. Da maneira que você estruturou o Xaml, a ListView está amarrada à coleção de jogadores, e tanto Name quanto Status estão dentro do ItemTemplate da ListView. Mova essas duas propriedades para dentro da classe Player e veja se funciona.

Boa sorte e bons estudos!

Olá Marcelo, obrigado pela resposta.

Mudei o nome da view model para players

Sobre não conseguir passar o valor para a viewmodel, eu tenho essas propriedades na classe player (Status e Name), porém não consegui ainda fazer minha view "conversar" com a view model. Se der pra dar uma olhada no meu código está no GIT.

Minha ideia é de quando o usuário tocar na SwitchCell , instanciar um novo player referente ao item tocado, pegar o valor atual da SwitchCell , para poder atualiza-lo no banco.