Trouver un control dans un template en WPF

xmox667 Messages postés 357 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 26 décembre 2011 - 18 mars 2011 à 11:30
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 - 28 mai 2011 à 11:04
Salut à tous,
J'essaye d'accéder à un control dans le template d'un ListBoxItem lorsqu'il est sélectionné mais j'ai un petit souci.


En XAML:

<DataTemplate x:Key= "SelectedTemplate" DataType="{x:Type local:MaClasse}">
<StackPanel Orientation="Horizontal">

<TextBlock Name ="ObjectName2" Margin= "5,0" Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>

<DataTemplate x:Key="ItemTemplate" DataType="{x:Type local:MaClasse}">
<StackPanel Orientation="Horizontal">

<TextBlock Name ="ObjectName1" Margin="5,0" Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>

<Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
</Style.Resources>

<Setter Property="ContentTemplate" Value="{StaticResource ItemTemplate}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}" />
</Trigger>
</Style.Triggers>
</Style>


<ListBox Name="MaList" HorizontalContentAlignment="Stretch"
ItemContainerStyle="{StaticResource ContainerStyle}"
SelectionChanged="MaList_SelectionChanged">
</ListBox>

En C#:

private void MaList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBoxItem item = (ListBoxItem)(MaList.ItemContainerGenerator.ContainerFromItem(MaList.SelectedItem));
ContentPresenter presenter = Helper.FindVisualChild<ContentPresenter>(item);
DataTemplate template = presenter.ContentTemplate;
TextBlock text = template.FindName("ObjectName1", presenter) as TextBlock;
}

J'arrive a récupérer le TextBlock "ObjectName1" Mais lorsque j'essaye avec avec "ObjectName2" j'obtient rien.

Merci , a tous

3 réponses

xmox667 Messages postés 357 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 26 décembre 2011 4
18 mars 2011 à 11:34
Salut,

Voici le code pour FindVisualChild :

public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}

merci
0
xmox667 Messages postés 357 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 26 décembre 2011 4
18 mars 2011 à 12:52
Salut,

J'ai trouvé un début de réponse.
Lorsque l'event SelectionChanged est déclenché le template de selection n'a pas encore été appliqué.
L'utilisation de l'event PreviewMouseLeftButtonUp de la listbox règle le problème. Mais je ne suis pas sûr que ce soit la bonne façon de faire.
Si quelqu'un sait comment faire je suis preneur.

merci, a++
0
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 2
28 mai 2011 à 11:04
Salut!
Y'a t'il une raison particulière pour la quel tu fais ca? C'est quand même à eviter de parcourir l'arbre visuel. Tu pourrais pas faire juste avec des Triggers?
0