WPF TreeView не загружает TreeViewItems до тех пор, пока родитель не будет расширен - PullRequest
1 голос
/ 04 марта 2011

У меня проблема с Treeview, которая сводит меня с ума !!!

Мой TreeView привязан к объектной модели глубиной 3 уровня и использует HierarchicalDataTemplate для определения того, что должно отображаться для каждого уровня:

Компания
+ Ветвп
- + - Контакт

Я хочу сделать конкретный контакт для выбранного узла, что я делаю так (контакт - это объект из объектной модели с привязкой к данным):

Dim companyTreeViewItem As TreeViewItem = Me.AgentTreeView.ItemContainerGenerator.ContainerFromItem(contact.Branch.Company)
Dim branchTreeViewItem As TreeViewItem = companyTreeViewItem.ItemContainerGenerator.ContainerFromItem(contact.Branch)
Dim contactTreeViewItem As TreeViewItem = branchTreeViewItem.ItemContainerGenerator.ContainerFromItem(contact)

Если я разверну древовидное представление, чтобы узел, который должен быть выбран, был виден (а затем пошел и выбрал что-то еще), этот код работал, однако, если я запустил его, прежде чем развернуть какие-либо узлы, branchTreeViewItem вернется как Nothing (null) .

Любые идеи, как я могу получить TreeViewItem для моего контактного объекта и установить его в качестве выбранного?

EDIT

Код, который заполняет древовидное представление, просто устанавливает DataContext элемента управления:

Me.DataContext = New ObjectModel.ObservableCollection(Of DAL.Company)(From c In entities.Companies.Include("Branches").Include("Branches.Contacts") Order By c.CompanyName)

В этом случае дерево имеет простую привязку

<TreeView ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="False" >

1 Ответ

3 голосов
/ 04 марта 2011

Правильным решением было бы использовать MVVM и создать модель представления для каждого элемента в свойствах TreeView с IsSelected и IsExpanded, связанными с соответствующими свойствами TreeViewItem. Тогда вы сможете манипулировать состояниями IsExpanded и IsSelected без необходимости набора номера с помощью генераторов контейнеров элементов.

Но вы также можете сделать следующее (извините, мой код будет на C #):

TreeViewItem companyTreeViewItem = (TreeViewItem)AgentTreeView.ItemContainerGenerator.ContainerFromItem(contact.Branch.Company);
companyTreeViewItem.IsExpanded = true;

companyTreeViewItem.ItemContainerGenerator.StatusChanged += (o, e) => {
    if (companyTreeViewItem.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) 
    {
        TreeViewItem branchTreeViewItem = (TreeViewItem) companyTreeViewItem.ItemContainerGenerator.ContainerFromItem(contact.Branch);
        branchTreeViewItem.IsExpanded = true;

        branchTreeViewItem.ItemContainerGenerator.StatusChanged += (o1, e1) => {
            if (branchTreeViewItem.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) 
            {
                TreeViewItem contactTreeViewItem = (TreeViewItem) branchTreeViewItem.ItemContainerGenerator.ContainerFromItem(contact);
                contactTreeViewItem.IsSelected = true;
            }
        };
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...