首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改ItemsSource后,TreeViewItem.ItemContainerGenerator返回null

更改ItemsSource后,TreeViewItem.ItemContainerGenerator返回null
EN

Stack Overflow用户
提问于 2017-03-07 19:36:41
回答 1查看 143关注 0票数 0

在TreeViewItem_OnExpanded事件中,我有以下代码。

代码语言:javascript
复制
var expandedTreeViewItem = e.OriginalSource as TreeViewItem;
var child = expandedTreeViewItem.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
expandedTreeViewItem.ItemsSource = // Update ItemsSource
var child = expandedTreeViewItem.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;

在更改扩展树视图项的ItemSource之前获取子项没有问题,但更改ItemSource后,子项将为空。

在更改ItemSource之前和之后,ContainerFromItem中的项目(项目)相同且存在。代码的其他部分工作正常。在ItemSource更改后,如何才能获取元素?

TreeViewItem_OnExpanded事件代码

代码语言:javascript
复制
private void TreeViewItem_OnExpanded(object sender, RoutedEventArgs e)
    {
        var expandedTreeViewItem = e.OriginalSource as TreeViewItem;

        var directoryInfo = expandedTreeViewItem?.Items[0] as DirectoryInfoModel;

        if (expandedTreeViewItem == null || directoryInfo?.HasChild == false) return;

        _folderExplorerViewModel.GetDirectories(directoryInfo?.DirectoryInfo, directoryInfo?.SubDirectoriesCollection);

        expandedTreeViewItem.ItemsSource = directoryInfo?.SubDirectoriesCollection;

        var expandedItemHeader = expandedTreeViewItem?.Template.FindName("PART_Header", expandedTreeViewItem) as ContentPresenter;
        var expandedItemCheckBox = expandedItemHeader?.ContentTemplate.FindName("CheckBoxFolderItem", expandedItemHeader) as CheckBox;

        foreach (var item in expandedTreeViewItem.Items)
        {
            var childItem = expandedTreeViewItem.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
            var childHeader = childItem?.Template.FindName("PART_Header", childItem) as ContentPresenter;
            var childCheckBox = childHeader?.ContentTemplate.FindName("CheckBoxFolderItem", childHeader) as CheckBox;

            if (childCheckBox != null && expandedItemCheckBox != null)
            {
                childCheckBox.IsChecked = expandedItemCheckBox.IsChecked;
            }
        }
    }

当我在ItemesSource更改后使用它时,childItem总是为空。但在此之前,它是有效的。

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-09 22:45:33

我找到了答案here。在TreeViewItem_OnExpanded事件未完成其作业之前,未在UI中创建新项,因此ItemContainerGenerator返回null。我在其类中创建了通用的expandedTreeViewItem,并为每个展开的树视图项添加了LayoutUpdated事件处理程序,然后在LayoutUpdated事件中,我可以访问ItemSource添加的新项。我不知道这是否是一种标准的方法,但现在它可以在没有任何返回null的情况下工作。

代码语言:javascript
复制
private TreeViewItem _expandedTreeViewItem;

    private void TreeViewItem_OnExpanded(object sender, RoutedEventArgs e)
        {
           _expandedTreeViewItem = e.OriginalSource as TreeViewItem;

        var directoryInfo = _expandedTreeViewItem?.Items[0] as DirectoryInfoModel;

        if (_expandedTreeViewItem == null || directoryInfo?.HasChild == false) return;

        _folderExplorerViewModel.GetDirectories(directoryInfo?.DirectoryInfo, directoryInfo?.SubDirectoriesCollection);

        _expandedTreeViewItem.ItemsSource = directoryInfo?.SubDirectoriesCollection;

        _expandedTreeViewItem.LayoutUpdated += ExpandedTreeViewItem_OnLayoutUpdated;      
 }

private void ExpandedTreeViewItem_OnLayoutUpdated(object sender, EventArgs e)
        {
            var expandedItemHeader = _expandedTreeViewItem?.Template.FindName("PART_Header", _expandedTreeViewItem) as ContentPresenter;
            var expandedItemCheckBox = header?.ContentTemplate.FindName("CheckBoxFolderItem", header) as CheckBox;

        foreach (var item in _expandedTreeViewItem.Items)
        {
            var childItem = _expandedTreeViewItem.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
            var childHeader = childItem?.Template.FindName("PART_Header", childItem) as ContentPresenter;
            var childCheckBox = childHeader?.ContentTemplate.FindName("CheckBoxFolderItem", childHeader) as CheckBox;

            if (childCheckBox != null && expandedItemCheckBox != null)
            {
                childCheckBox.IsChecked = expandedItemCheckBox.IsChecked;
            }
        }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42647315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档