У меня огромная проблема с WPF TreeView.Я настроил дерево, похожее на это.
<TreeView DataContext="{Binding Projects}">
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
<TreeView.Resources>
<HierarchicalDataTemplate x:Key="LoadTemplate">
<Grid>
<TextBlock Text="{Binding Name}" />
</Grid>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="StepTemplate"
ItemsSource="{Binding Loads}"
ItemTemplate="{StaticResource LoadTemplate}">
<Grid>
<TextBlock Text="{Binding Name}" />
</Grid>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="ProjectTemplate"
ItemsSource="{Binding Steps}"
ItemTemplate="{StaticResource StepTemplate}">
<Grid>
<TextBlock Text="{Binding Name}" />
</Grid>
</HierarchicalDataTemplate>
</TreeView.Resources>
<TreeViewItem Header="Project Workspace"
ItemsSource="{Binding}"
IsExpanded="True"
ItemTemplate="{StaticResource ProjectTemplate}" />
</TreeView>
TreeView привязан к DependencyProperty под названием Projects, который представляет собой ObservableCollection в файле code-behind для xaml.Базовая структура классов, с которыми связано дерево, следует структуре дерева.Таким образом, Project содержит пользовательскую коллекцию, которая реализует интерфейсы INotifyPropertyChanged и ICollectionChanged.Эта коллекция доступна через свойство Steps и содержит объекты Step.Класс Step также имеет экземпляр той же пользовательской коллекции, доступной из свойства Loads, и содержит объекты Load.
Теперь, когда я работаю с любым объектом в проектах, дерево ведет себя корректно, так как узлы появляются и исчезают.и корректно изменяется при изменении набора вложенных коллекций.По большей части, все работает как надо.
Хотя я и не показывал этого в Xaml выше, у каждого из узлов выше есть свое собственное специфическое контекстное меню.Одним из параметров в этом контекстном меню является добавление объекта.Например, если вы щелкнете правой кнопкой мыши по узлу Step, у вас есть возможность добавить узел Load под ним.Добавление класса Load в свойство Loads объекта Step действительно приводит к тому, что узел прекрасно отображается в дереве.
Так, например, код выглядит примерно так:
Projects[0].Steps[0].Loads.add(new Load());
Ладно, вот проблема, которую я пытался выяснить дольше всего.После того, как этот новый узел появляется в дереве, его родительский узел больше не может быть выбран.Таким образом, в данном примере вы не можете выбрать узел Step, которому принадлежит только что добавленный узел Load.Вы по-прежнему можете выполнять такие действия, как DoubleClick и RightClick, и запускать события, но простое нажатие левой кнопкой мыши на одно нажатие не приведет к выделению узла Step или его фокусировке.Я перепробовал все, что мог придумать, и не могу понять, почему бы и нет.
Теперь я могу щелкнуть по другим узлам в дереве, и их можно легко выбрать.И после этого узел, который ранее не позволял бы быть выбранным, затем восстанавливает свою прежнюю функциональность и снова может быть выбран.
Итак, что происходит, когда вы добавляете новый узел, он появляется, и этоНевозможно выбрать родительский элемент, пока вы не выберете какую-либо другую часть TreeView, а затем все снова в порядке.