none
DataTemplate dentro de ListBox no WP7 RRS feed

  • Pergunta

  • Pessoal,

    Estou tendo dificuldades em saber como pegar um valor clicado pelo usuário no checkbox. Primeiro, tenho ele traz um select com todos os dados do banco no Azure, e preenche o <ListBox>, mas dentro dele coloquei o <ListBox.ItemTemplate> e depois um <DataTemplate> e controles como <TextBox> e <TextBlock> e <CheckBox>. Tudo perfeito.

    Agora com um <DataTemplate> é impossível fazer um if(chechBox.IsChecked == true) pois ele não acha o atributo x:Name do <CheckBox>.

    Coloquei o <ListBox Margin="0,0,-12,10" x:Name="lstVaccines" SelectionChanged="lstVaccines_SelectionChanged"> evento de saber quando selecionei o item. Mas não consigo saber se o item que selecionei da lista está com o seu CheckBox marcado como TRUE ou FALSE.

    Alguém já passou por esse problema?

    No xaml:

    <ListBox Margin="0,0,-12,10" x:Name="lstVaccines" SelectionChanged="lstVaccines_SelectionChanged">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Margin="0,0,0,17" Height="140" Width="456">
                                <StackPanel Width="456" Orientation="Vertical" Height="140">
                                    <StackPanel Orientation="Horizontal" Height="70">
                                        <TextBlock Text="{Binding Name}" Foreground="Black" 
                                                    TextWrapping="Wrap" x:Name="txtNameVaccine"
                                                    Margin="0,20,0,0" FontSize="28"/>
                                        <TextBlock Text="{Binding IDVaccine}" Margin="0,20,0,0"
                                                    TextWrapping="Wrap" Foreground="#FF2A5370" 
                                                    x:Name="txtIDvaccine" Visibility="Collapsed"/>
       <CheckBox x:Name="chSimpleDose" Content="Simple" IsEnabled="{Binding SimpleDose}" 
                                                    HorizontalAlignment="Left" Margin="0,0,0,0" 
                                                    Foreground="#FF2A5370" BorderBrush="#FF010101" 
                                                    Background="#FFA6C0DA" Style="{StaticResource CheckBoxStyles}"
                                                    IsThreeState="False" IsChecked="False" />
                                    </StackPanel>
       </StackPanel>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
     </ListBox> 

    No xaml.cs:

    Quero fazer assim:

    if (null != lstVaccines.SelectedItem)
    {
    if(chSimpleDose.IsChecked == true) <- AQUI ELE NÂO ACHA ESSE NEGÓCIO
    {
    txtAlert.Text = "Foi clicado";
    }
    }

    quarta-feira, 18 de abril de 2012 15:52

Todas as Respostas

  • Olá amigo, vou tentar lhe ajudar, acredito que de certo.

    Você deverá criar uma classe que receberá os dados vindos do banco, esta classe deverá conter uma variável bool que irá ser utilizada para verificar se o checkbox esta marcado.

    Após preencher seu DataContext com um List desta classe,

    basta utilizar o seguinte comando no método lstVaccines_SelectionChanged...

       Classe cl = (Classe)lstVaccines.SelectedItem;

    Assim você irá pegar o objeto selecionado no List e poderá vericar se  propriedade bool esta como true ou false.

    Abraço!

    quarta-feira, 18 de abril de 2012 17:30
  • Sergio,

    É quase isso. Esse classe eu tenho. O que quero fazer é, os CheckBox estão todos desmarcados, é a regra de negócio. Quando o usuário clicar em um deles, só vou deixar salvar se 1 ou mais estiverem com seu status atual ou seja chSimpleDose.IsChecked como true.

    E com esse DataTemplate ele não deixa pegar o componente pelo x:Name.

    quarta-feira, 18 de abril de 2012 17:44
  • No momento to sem o VS aqui no trabalho para testar, mas acho que um foreach no método, algo do tipo

    bool verificaMarcacao;

    Foreach(Classe i in lstVaccines){

         if(i.Marcado == true)

         {

             verificaMarcacao = true; return;

          }

    }

        if(verificaMarcacao == false) {messageBox.Show("Não é Permitido Salvar");}

       else{.........

    quarta-feira, 18 de abril de 2012 17:56
  • Sergio,

    Essa alternativa deve ser boa no bt_Salvar.

    Faço esse foreach e vejo se o ListBox que já está preenchido é claro. Pois no método construtor usei um this.Loaded apontando para o delegate de carregar esse ListBox com todos os dados do banco no Azure. Vou testar aqui. Aguenta ai, que falar se funfou.

    quarta-feira, 18 de abril de 2012 18:05
  • Sergio,

    Essa idéia não deu certo porque na verdade é a mesma coisa que o this.Loaded += new RoutedEventHandler(Page1_Loaded);

    Ou seja, que preencher todos os Binding dos componetes, por isso eu já carrego o DataTemplate assim:

     foreach (ServiceModel item in e.Result)
                                {
                                        listVaccines.Add(new VaccinesModel()
                                        {
                                            ID = item.ID,
                                            Name = item.Name
                                        });
                                }

                                lstVaccines.ItemsSource = listVaccines;

    Agora pra salvar como você tá pedindo é a mesma coisa que to fazendo pra carregar, não consigo pegar o valor do CheckBox que tá dentro do DateTemplate, por exemplo: eu fui lá e cliquei num CheckBox, nesse foreach dentro do bt_Salvar ele não traz o valor de chSampleDose.

    É nisso que to apanhando. Pois a lista é sempre dinâmica, por isso esse DataTemplate, o problema pegar valor que eu selecionei dentro dela.

    quarta-feira, 18 de abril de 2012 18:49
  • Achei este post, da uma lida no exemplo do Tiago Monaco

    http://social.msdn.microsoft.com/Forums/pt/winphone7pt/thread/cab8c42b-6a8a-4b42-8282-9aa9d6bb2cec

    Note que no exemplo dele há na classe um booleano que é vinculado ao list. Desta forma podemos pegar o valor se é true ou false através do foreach no método Salvar.

    Vou acessar o VS a noite la pelas 22:00, dai caso não tenha te adiantado o exemplo dele, informe aqui, que lhe passo o código com a solução que eu encontrar.

    Até mais.

    quarta-feira, 18 de abril de 2012 19:36
  • Esse post não resolveu, pois com binding pra preencher sem checked eu já faço:

    public class ItemModel : INotifyPropertyChanged
        {
            private int _ID;
            private string _Name;
            public event PropertyChangedEventHandler PropertyChanged;

            public int ID
            {
                get { return _ID; }
                set
                {
                    _ID = value;
                    NotifyPropertyChanged("ID");
                }
            }

    public string Name
            {
                get { return _Name; }
                set
                {
                    _Name = value;
                    NotifyPropertyChanged("Name");
                }
            }

    private void NotifyPropertyChanged(string propertyName)
            {
                if (null != PropertyChanged)
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }

    }

    O problema é como eu faço pra pegar um valor de true ou false clicado pelo usuário dentro de um DataTamplate? Pois ele ficam ocultos dentro de um DataTamplete.

    sexta-feira, 20 de abril de 2012 00:55