Comment accéder à un élément spécifique dans une zone de liste avec DataTemplate?
J'ai une ListBox, y compris un ItemTemplate avec 2 StackPanels.
Il y a une zone de texte dans la deuxième StackPanel je veux accéder.
(Changer la visibilité de vrai et d'accepter la saisie de l'utilisateur)
Le déclencheur doit être le SelectionChangedEvent. Donc, si un utilisateur clique sur une ListBoxItem, le TextBlock devient invisible et la zone de texte devient visible.
CODE XAML:
<ListBox Grid.Row="1" Name="ContactListBox" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ItemsSource="{Binding Contacts}" Margin="0,36,0,0" SelectionChanged="ContactListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="Edit Contact" Click="ContactMenuItem_Click"/>
<toolkit:MenuItem Header="Delete Contact" Click="ContactMenuItem_Click"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<Grid>
<Rectangle Fill="{StaticResource PhoneAccentBrush}"
Width="72" Height="72">
<Rectangle.OpacityMask>
<ImageBrush ImageSource="/Images/defaultContactImage.png" Stretch="UniformToFill"/>
</Rectangle.OpacityMask>
</Rectangle>
</Grid>
<StackPanel>
<TextBox Text="{Binding Name}" TextWrapping="Wrap" Visibility="Collapsed"/>
<TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />
<TextBlock Text="{Binding Number}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextAccentStyle}"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Je suppose qu'il ya plusieurs façons de résoudre ce problème, mais rien j'ai essayé de travaillé.
Mon approche actuelle ressemble à ceci
private void ContactListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBoxItem listBoxItem = ContactListBox.SelectedItem as ListBoxItem;
DataTemplate listBoxTemplate = listBoxItem.ContentTemplate;
//How to access the DataTemplate content?
StackPanel outerStackPanel = listBoxTemplate.XXX as StackPanel;
StackPanel innerStackPanel = outerStackPanel.Children[1] as StackPanel;
TextBox nameBox = innerStackPanel.Children[0] as TextBox;
TextBlock nameBlock = innerStackPanel.Children[1] as TextBlock;
nameBox.Visibility = System.Windows.Visibility.Visible;
nameBlock.Visibility = System.Windows.Visibility.Collapsed;
}
source d'informationauteur sust86
Vous devez vous connecter pour publier un commentaire.
Merci pour votre aide les gars!! Enfin je l'ai eu. Résolu le problème avec le VisualTreeHelper. Ce qu'est une fonction très utile ^^
helperFunction
Avec cette édité fonction, vous pouvez également effectuer une recherche de contrôle par nom (son converti à partir VB.NET):
Je ne peux pas vous donner une réponse complète...
Mais je pense que vous pouvez utiliser le VisualTreeHelper pour itérer sur les enfants de tout contrôle
http://blogs.msdn.com/b/kmahone/archive/2009/03/29/visualtreehelper.aspx
Toutefois, pour l'effet que vous recherchez, alors je pense que l'aide de la SelectedItem Style pourrait être une meilleure solution - voir, par exemple, cet article - http://joshsmithonwpf.wordpress.com/2007/07/30/customizing-the-selected-item-in-a-listbox/
Depuis DataTemplate est un modèle générique qui pourrait être utilisé à de nombreuses reprises dans le code, il n'y a aucun moyen d'y accéder par le nom de (x:Name="numberTextBox").
J'ai résolu le même problème pour ce faire, une collection de Contrôles -, tandis que la zone de liste été le remplissage j'ai ajouter un contrôle de zone de texte à la collection.
Jusqu'à ce que je trouve un meilleur soultion - propriété Tag. Dans votre ListboxItem vous lier la propriété Tag du nom
et l'accès
Utilisation
ItemContainerGenerator
.