Je rencontre des problèmes lors de l'obtention d'un événement de clic sur un bouton et j'utilise Silverlight 3.0 avec Silverlight Toolkit.Silverlight: Définir le gestionnaire d'événements dans le modèle de données hiérarchique
Problème
Je possède ce TreeView:
TreeView sample http://a.imagehost.org/0939/TreeView.png.
La valeur d'un nœud donné est la somme des valeurs de ses enfants. Seules les feuilles peuvent être ajoutées (pour le moment). Ce que je veux réaliser est qu'un utilisateur peut ajouter (et finalement enlever) des entrées dans l'arbre pour finalement créer un diagramme personnalisé. À cette fin, je voudrais que le «signe plus» pour insérer une nouvelle ligne/nœud en tant qu'enfant du nœud sur lequel l'utilisateur a cliqué. (C'est à dire si je clique sur le plus à "Affichage", je reçois une ligne ci-dessous pour spécifier CRT ou TFT ou autre.)
Chose est, car tout mon cerveau vaut, je ne sais pas comment recevoir tout utile un événement. TextBlock, TextBox et Button sont définis dans un modèle hiérarchique et je ne peux pas définir de gestionnaire de clics dans ce modèle.
OTOH, je n'ai pas trouvé un moyen d'obtenir les éléments de modèle d'un certain TreeViewItem du code (C#). Très bien je suis capable de faire trv.ItemContainerGenerator.GetContainerFromItem (item), et comme Justin Angel showed je peux très bien changer la taille de la police, mais je n'ai trouvé aucun moyen d'accéder à la zone de texte ou au bouton.
Est-il possible de capturer l'événement click sur le bouton? Ou tout autre moyen d'obtenir quelque chose qui donne la fonctionnalité "ajouter ci-dessous"?
Merci d'avance.
Plus de données
Le XAML treeview est la suivante:
<controls:TreeView x:Name="SankeyDataTree"
ItemTemplate="{StaticResource SankeyTreeTemplate}" BorderThickness="0"
Background="{x:Null}" HorizontalAlignment="Left" VerticalAlignment="Top">
<controls:TreeViewItem IsExpanded="True">
<controls:TreeViewItem.HeaderTemplate>
<DataTemplate>
<TextBlock Text="Loading..."/>
</DataTemplate>
</controls:TreeViewItem.HeaderTemplate>
</controls:TreeViewItem>
</controls:TreeView>
J'utilise cette HierarchicalDataTemplate (et volé le appraoch de Timmy Kokke):
<Data:HierarchicalDataTemplate x:Key="SankeyTreeTemplate" ItemsSource="{Binding Children}">
<Grid Height="24">
<Grid.ColumnDefinitions>
<!-- ... -->
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Path=Value.name, Mode=TwoWay}" VerticalAlignment="Center"/>
<TextBox Text="{Binding Path=Value.flow, Mode=TwoWay}" Margin="4,0" VerticalAlignment="Center" d:LayoutOverrides="Width" Grid.Column="1" TextAlignment="Right" Visibility="{Binding Children, Converter={StaticResource BoxConverter}, ConverterParameter=\{box\}}"/>
<TextBlock Text="{Binding Path=Value.throughput, Mode=TwoWay}" Margin="4,0" VerticalAlignment="Center" d:LayoutOverrides="Width" Grid.Column="1" TextAlignment="Right" Visibility="{Binding Children, Converter={StaticResource BoxConverter}, ConverterParameter=\{block\}}"/>
<Button Margin="0" Grid.Column="2" Style="{StaticResource TreeViewItemButtonStyle}">
<Image Source="../Assets/add.png" Margin="0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Button>
</Grid>
</Data:HierarchicalDataTemplate>
A cette TreeView est lié un "SimpleTree", dont les valeurs tiennent fondamentalement unle chaîne (nom) et deux doubles (flux et débit).
public String name { get; set; }
public Double flow { get; set; }
public Double throughput { get; set; }
(plus le code de la INotifyPropertyChanged pour obtenir une liaison bidirectionnelle aux zones de texte.)
Awesome. Merci de votre aide! Je savais que Microsoft aurait été approfondie et avait un moyen de faire ce que j'essaie de faire. ;) – Cornelius
Où est la classe Node? J'ai besoin de ce comportement exact dans un UserControl WPF, mais je ne peux pas le compiler car je n'ai pas de référence à l'espace de noms pour la classe Node, et google n'a pas aidé. Merci. – Shawn
La classe 'Node' est votre classe" own ". C'est la classe de l'objet que chaque noeud dans l'arborescence est lié à l'aide de la liaison de données. –