Bonjour,
j'ai dans mon XAML un ItemsControl avec des enfants :
Je souhaite pouvoir updater une property TOTAL points chaque fois que la valeur de la textbox.text(dans le datatemplate) est modifiée, C'est pour cela que j'utilise la méthode TextBox_TextChanged.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 <ItemsControl x:Name="itemsControlPenalty" ItemsSource="{Binding SelectedAthleteResult.ObstaclePenalties}"> <ItemsControl.Template> <ControlTemplate> <ScrollViewer VerticalScrollBarVisibility="Auto"> <ItemsPresenter/> </ScrollViewer> </ControlTemplate> </ItemsControl.Template> <ItemsControl.ItemTemplate> <DataTemplate> <Grid> <Label Grid.Column="0" Content="{Binding ObstacleEvent.ObstacleId.Value}" /> <TextBox Grid.Column="1" x:Name="textBoxPenalty" Text="{Binding Penalty.Value, Converter={StaticResource PenaltyConv}}" TextChanged="TextBox_TextChanged" /> <Label Grid.Column="2" FontWeight="Bold" Content="="/> <Label Grid.Column="3" FontWeight="Bold" Content="{Binding TotalObstaclePenaltiesPoints}"/> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
J'ai donc un nombre x de textbox créée avec le DataTemlate
Dans mon code behind, j'ai besoin de reprendre chaque textBox de chaque instance de mon datatemplate afin de vérifier le contenu.
Malheureusement, je n'arrive à reprendre que l'item textbox 0, donc uniquement mon item datatemplate 0.
Voici le code behind:
La méthode permettant d'atteindre le control TextBox (qui ne fonctionne pas!)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { for (int counter = 0; counter < itemsControlPenalty.Items.Count; counter++) { TextBox textboxPenalty = FindChildByType<TextBox>(itemsControlPenalty);
private T FindChildByType<T>(DependencyObject parent)where T : DependencyObject {
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (child is T)
return child as T;
DependencyObject grandchild = FindChildByType<T>(child);
if (grandchild != null)
return grandchild as T;
}
return default(T);
Source de la méthode :
http://social.msdn.microsoft.com/For...0-d1af65f03485
si j'ai par exemple 3 éléments textbox avec des valeurs de 40, 30, 20
L'élément retourné sera toujours la textbox item contenant 40 (donc la textbox item 0).
J'ai essayé de modifier la méthode en passant un index pour retourner le bon élément ou de directement pointer sur le bon DataTemplate, mais rien n'y a fait...
Quelqu'un aurait-il une idée ???
merci d'avance
Partager