【发布时间】:2017-03-07 11:36:41
【问题描述】:
在 TreeViewItem_OnExpanded 事件中,我有以下代码。
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之前获取child没有问题,但是在更改ItemSource之后,child将为null。
ContainerFromItem(item) 中的item 相同,并且在更改ItemSource 之前和之后都存在。代码的其他部分正常工作。在 ItemSource 更改后,我该怎么做才能获取元素?
TreeViewItem_OnExpanded 事件代码
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 始终为 null。但在此之前,它可以工作。
非常感谢。
【问题讨论】:
-
这也可能是
as的结果。您能否检查expandedTreeViewItem.ItemContainerGenerator.ContainerFromItem(item)本身是否也返回null?万一此调用返回ContentPresenter(而不是TreeViewItem),通过as进行转换将返回null。 -
@dotNET 你的意思是替换 ItemSource 后 TreeView 将不再使用 TreeViewItems 作为项目容器?
-
@Parham 你确定
item真的是新ItemsSource 集合的一个元素吗? -
@dotNET 当我使用 ItemContainerGenerator.ContainerFromItem(item) 后总是返回 null,无论是强制转换还是不强制转换。感谢您的回复。
-
@Clemens 是的,我确定。因为在调试模式下我可以看到项目的详细信息,一切正常。但是只是 ItemContainerGenerator 返回 null 就在我在 ItemSource 更改后使用它的时候!感谢回复
标签: wpf itemsource