WPF ItemsControl从数据对象获取容器(TreeView,Multiselect)

时间:2011-03-25 13:52:17

标签: wpf treeview selection itemscontrol

如何在WPF ItemsControl中获取对象的容器。

我正在使用可绑定的SelectedItem和SelectedItems依赖项属性编写多选树视图。所以一切都很好。唯一的事情是,当我第二次按下ctrl单击树中的项目时,不应选择此项目,而应选择上一个上一个选定的项目。 TreeView包含一个名为ChangeSelection的私有方法。据我所知,第一个参数是Container,第二个参数是TreeViewItem,最后一个是否应该选择项目。

我通过捕获SelectedItemChanged事件来实现多选。

此代码适用于新选择的项目

private void OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    var view = ItemContainerGenerator.ContainerFromItem(e.NewValue) as TreeViewItem;
    // ...
}

但是如果我想从ObservableCollection中保存的项目中获取TreeViewItem ......它将无法工作。

编辑:好的,我发现了。上面的代码仅适用于第一级项目......

1 个答案:

答案 0 :(得分:0)

编辑:这个问题的解决方案并非无足轻重。可以通过使用视图模型(例如,提供基本类型的接口,例如:IsSelected,IsExpanded,IsEnabled和Parent)来查找所选的树视图项。您可以像这样搜索TreeViewItem:

if (treeViewItem.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
{
    EventHandler eventHandler = null;

    eventHandler = delegate
    {
        treeViewItem.ItemContainerGenerator.StatusChanged -= eventHandler;
        // Call the search function recursive XYZ(tree, treeViewItem.ItemContainerGenerator.ContainerFromItem(nextLevelItem) as TreeViewItem);
    };

    // wait for the containers to be generated
    treeViewItem.ItemContainerGenerator.StatusChanged += eventHandler;
}
else
{
    // Call the search function recursive XYZ(tree, treeViewItem.ItemContainerGenerator.ContainerFromItem(nextLevelItem) as TreeViewItem);
}