Trouver un control dans un template en WPF

Signaler
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
-
Messages postés
212
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
28 mai 2011
-
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
A voir également:

3 réponses

Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
4
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
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
4
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++
Messages postés
212
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
28 mai 2011
2
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?