Inquiridor
DataTemplate dentro de ListBox no WP7

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";
}
}
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!
-
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.
-
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{.........
-
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.
-
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.
-
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.
-
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.