J'ai donc un problème avec TreeView. Si je construis une vue arborescente de manière statique, chaque nœud de l'arbre est sélectionnable en ce sens que lorsque je clique dessus, il se met en évidence en bleu, indiquant que le nœud est sélectionné.WPF/XAML TreeView ne reconnaît pas les nœuds après la liaison
<TreeView
Grid.Column="0"
Grid.Row="2"
MinHeight="100"
MinWidth="100"
BorderBrush="White"
DataContext="{Binding Projects, Source={x:Static SizingApp:Manager.Instance}}">
<TreeViewItem Header="Project 1" IsExpanded="True">
<TreeViewItem Header="Step 1" IsExpanded="True">
<TreeViewItem Header="Load 1" IsExpanded="True"></TreeViewItem>
<TreeViewItem Header="Load 2" IsExpanded="True"></TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="Step 2" IsExpanded="True">
<TreeViewItem Header="Load 1" IsExpanded="True"></TreeViewItem>
<TreeViewItem Header="Load 2" IsExpanded="True"></TreeViewItem>
</TreeViewItem>
</TreeViewItem>
Cependant, je suis la liaison à la TreeView pour le remplir. En outre, je lie aux objets qui implémentent Emiel Jongerius's BindableObjectBase3 class. C'est une merveilleuse implémentation de classe de base qui permet à mes objets d'être Bindable et d'implémenter l'interface INotifyPropertyChanged avec le souci de la gestion manuelle de DependencyProperty.
Donc, c'est la structure de classe de base (simplifiée à partir de mes objets réels) que j'essaye d'implémenter dans un TreeView.
public abstract class MyCustomClass : BindableObjectBase3
{
private string m_strName;
public virtual string Name
{
get
{
using (this.GetPropertyTracker(() => this.Name))
{
return m_strName;
}
}
set
{
this.SetValue(ref this.m_strName, value,() => this.Name);
}
}
}
public class Project : MyCustomClass
{
private List<Step> m_steps;
public List<Step> Steps
{
get
{
using (this.GetPropertyTracker(() => this.Steps))
{
return m_steps;
}
}
set
{
this.SetValue(ref this.m_steps, value,() => this.Steps);
}
}
}
public class Step : MyCustomClass
{
private List<Load> m_loads;
public List<Load> Loads
{
get
{
using (this.GetPropertyTracker(() => this.Loads))
{
return m_loads;
}
}
set
{
this.SetValue(ref this.m_loads, value,() => this.Steps);
}
}
}
public class Load : MyCustomClass
{
}
Et c'est le XAML de base que j'utilise pour mettre en œuvre le TreeView:
<TreeView
Grid.Column="0"
Grid.Row="2"
MinHeight="100"
MinWidth="100"
BorderBrush="White"
DataContext="{Binding Projects, Source={x:Static SizingApp:Manager.Instance}}">
<TreeView.Resources>
<HierarchicalDataTemplate x:Key="LoadTemplate">
<TreeViewItem Header="{Binding Path=Name}">
</TreeViewItem>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="StepTemplate">
<TreeViewItem Header="{Binding Path=Name}" IsExpanded="True"
ItemsSource="{Binding Path=Loads}"
ItemTemplate="{StaticResource LoadTemplate}">
</TreeViewItem>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="ProjectTemplate">
<TreeViewItem Header="{Binding Path=Name}" IsExpanded="True"
ItemsSource="{Binding Path=Steps}"
ItemTemplate="{StaticResource StepTemplate}">
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.Resources>
<TreeViewItem
Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Header}"
ItemsSource="{Binding}"
IsExpanded="True"
Focusable="True"
ItemTemplate="{StaticResource ProjectTemplate}">
</TreeViewItem>
</TreeView>
Maintenant, tout cela fonctionne bien dans la mesure où la liaison va. Je peux lier à un ObservableCollection <Project> et comme j'ajoute/supprime/manipule des projets, le TreeView se met à jour en conséquence.
Cependant, le seul nœud dans le TreeView qui semble sélectionnable est le premier nœud (celui qui est statique). Tous les autres nœuds créés via la liaison dynamique n'indiquent pas qu'ils sont sélectionnés sur l'interface graphique. Je m'attendrais à ce qu'ils mettent également en évidence le bleu quand on clique dessus. Mais à la place, ils ne font rien. Est-ce que quelqu'un a une idée de pourquoi?
Je ne peux pas croire que personne n'a jamais rencontré ce problème avant? – Ristogod