Узлы WPF TreeView становятся недоступными после добавления дочерних узлов - PullRequest
0 голосов
/ 07 октября 2010

У меня огромная проблема с 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, а затем все снова в порядке.

1 Ответ

0 голосов
/ 12 октября 2010

Без посторонней помощи и безуспешных попыток я перешел на использование элементов управления Telerik. После замены TreeView по умолчанию на RadTreeView от Telerik все мои проблемы исчезли. Я бы порекомендовал, если это возможно, чтобы люди избегали встроенного в Microsoft WPF TreeView элемента управления, поскольку он изобилует бесчисленными проблемами, и вы потратите огромное количество времени, пытаясь разобраться с ними, а не разрабатывать свое приложение.

...