Usuário com melhor resposta
Como inserir um checkbox e button no listview?

Pergunta
-
Pessoal,
Tudo bem ?
Ai vai um problema para vocês me ajudarem:
Tenho um listview e estou tendo problemas em utilza-lo. São quatro colunas e nelas serão inseridas informações. Entao, o que estou precisando fazer é:
- Primeiro preciso fazer aparecer as linhas ;
- Nos campos da coluna "imagem" preciso inserir um button; (é possivel colocar dois objetos numa mesma celula?)
- por ultimo, nos campos da coluna "correto" preciso de um checkbox.
Estou enviando o que consegui fazer ate agora ...
Vcs pode me dar uma ajuda?
Obrigado.
<GroupBox Width="Auto" Height="Auto" FontSize="11" Header="Alternativas" Margin="0,10,0,10" HorizontalAlignment="Stretch">
<ListView IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Stretch"
Width="Auto" Margin="0,10,0,0" Height="250" Grid.Row="1"
SelectionMode="Single">
<ListView.View >
<GridView>
<GridViewColumn Header="Item" Width="50" />
<GridViewColumn Header="Alternativa" Width="500"/>
<GridViewColumn Header="Imagem" Width="175" />
<GridViewColumn Header="Correta" Width="Auto">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Correta}" HorizontalAlignment="Center" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</GroupBox>
Respostas
-
Faça um ItemTemplate como o seguinte (você pode usar uma grid ao invés do StackPanel):
<DataTemplate x:Key="ColunasTemplate">
e configure o ItemTemplate da ListBox assim:
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Nome}" FontWeight="Bold" />
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Endereco}"/>
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Telefone}"/> </StackPanel>
</StackPanel>
</DataTemplate><ListBox HorizontalAlignment="Stretch" Margin="5" Name="listBox1"
VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch"
ItemTemplate="{StaticResource ColunasTemplate}"/>
Se quiser colocar as linhas de grid, coloque uma borda em volta de cada TextBlock:
Se quiser colocar as colunas com tamanhos fixos, dê um Width para os TextBlocks.<Border BorderBrush="Gray">
<TextBlock Text="{Binding Path=Nome}" FontWeight="Bold" />
</Border>
Estes dois artigos mostram como fazer uma ListBox multicolunas:
http://blogs.msdn.com/henryh/archive/2005/06/23/431846.aspx
http://itknowledgeexchange.techtarget.com/wpf/listbox-multi-column-example/
Bruno
Todas as Respostas
-
Para inserir mais de um controle em uma célula, use um panel no datatemplate, como em:
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<TextBlock Text="Texto" />
<Image Source="Imagem.jpg" />
</StackPanel>
</DataTemplate>No mais, as coisas parecem estar corretas.
Bruno
-
Bruno,
Obrigado.
Mais uma ajuda.
- Quanto a visualização das linhas, como faço para que apareça a linha de uma celula para outra, tipo planilha ?
- Como posso inserir o mesmo template que crie na 1º linha um para as outras linhas da tabela com uma quantidade fixa de linhas, ou mesmo inserir novas linhas a partir de um "enter" de modo dinamico.
No momento o listview só tem uma linha com o esquema que preciso.
Pode me ajudar.
Obrigado.
Este é o código atual.
<Grid x:Name="LayoutRoot">
<Grid.Resources>
<XmlDataProvider x:Key="src" XPath="/Root">
<x:XData>
<Root xmlns="">
<Item flag="false"/>
</Root>
</x:XData>
</XmlDataProvider>
</Grid.Resources>
<ListView IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Stretch"
Width="Auto" Margin="0,10,0,0" Height="250" Grid.Row="1"
SelectionMode="Single" DataContext="{StaticResource src}" ItemsSource="{Binding XPath=Item}">
<ListView.View >
<GridView>
<GridViewColumn Header="Item" DisplayMemberBinding="{Binding XPath=@id}" Width="50" />
<GridViewColumn Header="Alternativa" Width="500">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name="txtAlternativa" Width="500" Height="auto" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Imagem" Width="175">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<Button x:Name ="bntCelula" Content="Buscar" FontSize="5" Width="40" Height="15"/>
<TextBlock x:Name="txtCaminhoImagem" Text="....."/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Correta" Width="Auto">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding XPath=@flag}" HorizontalAlignment="Center" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid> -
Para inserir as linhas, você deve colocar uma borda no DataTempleate das células.
Para fazer um template único por linha, eu faria o seguinte: não usaria a ListView e sim a ListBox. No ItemsTemplate da ListBox, crio um DataTemplate que nada mais é que um StackPanel com todas as minhas células. Veja o meu artigo no CodeProject:
http://www.codeproject.com/KB/WPF/wpfviews.aspx
Bruno -
Bruno,
tentei utilizar o listbox, mas nao tive muito sucesso.
A ideia de colocar os objetos dentro do Stack eu entendi. O problema é que não estou conseguindo usar o listBox para colocar colunas. Se é que dá para fazer isso.
Pode me dar um exemplo do ListBox com pelo menos duas colunas, por favor.
obrigado -
Faça um ItemTemplate como o seguinte (você pode usar uma grid ao invés do StackPanel):
<DataTemplate x:Key="ColunasTemplate">
e configure o ItemTemplate da ListBox assim:
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Nome}" FontWeight="Bold" />
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Endereco}"/>
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Telefone}"/> </StackPanel>
</StackPanel>
</DataTemplate><ListBox HorizontalAlignment="Stretch" Margin="5" Name="listBox1"
VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch"
ItemTemplate="{StaticResource ColunasTemplate}"/>
Se quiser colocar as linhas de grid, coloque uma borda em volta de cada TextBlock:
Se quiser colocar as colunas com tamanhos fixos, dê um Width para os TextBlocks.<Border BorderBrush="Gray">
<TextBlock Text="{Binding Path=Nome}" FontWeight="Bold" />
</Border>
Estes dois artigos mostram como fazer uma ListBox multicolunas:
http://blogs.msdn.com/henryh/archive/2005/06/23/431846.aspx
http://itknowledgeexchange.techtarget.com/wpf/listbox-multi-column-example/
Bruno