Wpf 在MVVM中获取选定的TreeViewItem

Wpf 在MVVM中获取选定的TreeViewItem,wpf,mvvm,datatemplate,treeviewitem,Wpf,Mvvm,Datatemplate,Treeviewitem,我想用可编辑的节点制作树状视图。我在谷歌上搜索了这篇我认为很好的文章: 但是我有一个问题。我的树状视图是静态形成的,而不是像弓形图中那样静态形成的。那样 <TreeView Name="_packageTreeView" Margin="5" ItemsSource="{Binding PackageExtendedList}"> <TreeView.InputBindings> <KeyBinding Key=

我想用可编辑的节点制作树状视图。我在谷歌上搜索了这篇我认为很好的文章:

但是我有一个问题。我的树状视图是静态形成的,而不是像弓形图中那样静态形成的。那样

    <TreeView Name="_packageTreeView" Margin="5" ItemsSource="{Binding PackageExtendedList}">
         <TreeView.InputBindings>
             <KeyBinding Key="C" Command="{Binding *TestCommand*}" CommandParameter="{Binding}" />
         </TreeView.InputBindings>
         <i:Interaction.Triggers>
             <i:EventTrigger EventName="SelectedItemChanged">
                 <i:InvokeCommandAction Command="{Binding PackageTreeItemChangeCommand}" CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"/>
             </i:EventTrigger>
         </i:Interaction.Triggers>
         <TreeView.ItemContainerStyle>
             <Style TargetType="{x:Type TreeViewItem}">
                 <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
             </Style>
         </TreeView.ItemContainerStyle>
         <TreeView.ItemTemplate>
             <HierarchicalDataTemplate DataType="{x:Type MasterBuisnessLogic:RootDocPackage}" ItemsSource="{Binding Path=Childs}">
                 <Grid>
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition>
                         </ColumnDefinition>
                         <ColumnDefinition>
                         </ColumnDefinition>
                     </Grid.ColumnDefinitions>
                    <Image Source="/Resources/DocGroup.png"></Image>
                    <Etb:EditableTextBlock Margin="5,0,0,0" Grid.Column="1" Text="{Binding Path=Name}"></Etb:EditableTextBlock>
                 </Grid> 
             </HierarchicalDataTemplate>
         </TreeView.ItemTemplate>
     </TreeView>
而不是XAML中的更改:

<Etb:EditableTextBlock Margin="5,0,0,0" Grid.Column="1" Text="{Binding Path=Name}" *IsEditable="{Binding Path=IsEditable}"*/>
不太管用:(
有什么想法吗?

第一个问题:由于您似乎可以选择多个条目,因此需要在TestCommand的执行方法中过滤所有选定的条目:

IEnumerable<DocPackageExtended> selectedEntries = PackageExtendedList.Where(d => d.IsSelected);
这可能对你有帮助

private void Button_Click(object sender, RoutedEventArgs e)
    {
        TreeViewItem treeViewItemFound = GetItem(MyTreeview, MyTreeview.SelectedItem);
        ContentPresenter header = treeViewItemFound.Template.FindName("PART_Header", treeViewItemFound) as ContentPresenter;
        if (header != null)
        {
            TextBox myTextBox = (TextBox)header.ContentTemplate.FindName("MyTextBox", header);
        }
    }

    public TreeViewItem GetItem(ItemsControl container, object itemToSelect)
    {
        foreach (object item in container.Items)
        {
            if (item == itemToSelect)
            {
                return (TreeViewItem)container.ItemContainerGenerator.ContainerFromItem(item);
            }
            else
            {
                ItemsControl itemContainer = (ItemsControl)container.ItemContainerGenerator.ContainerFromItem(item);
                if (itemContainer.Items.Count > 0)
                {
                    TreeViewItem treeViewItemFound = GetItem(itemContainer, itemToSelect);
                    if (treeViewItemFound != null)
                        return treeViewItemFound;
                }
            }
        }

        return null;
    }

我在第一篇文章中添加了答案,以便能够格式化代码,look。如何在文本中生成灰色背景?找不到。我假设TestCommand中的CommandParameter是
ViewModel
本身,而不是
DocPackageExtended
-实例,因此会话始终返回null。如果是这种情况,请查看我的edit.CommandParameterer具有正确的类型对象(DocPackageExtended),已在调试器下检查。不允许多重选择。
private void TestCommandMethod(object obj)
{
    var dpe = obj as DocPackageExtended;
    if (dpe == null)
       return;
    dpe.IsEditable = true;
}
IEnumerable<DocPackageExtended> selectedEntries = PackageExtendedList.Where(d => d.IsSelected);
private void TestCommandMethod(object obj)
{
    var dpe = obj as DocPackageExtended;
    if (dpe == null)
       return;
    dpe.IsEditable = true;
    foreach (RootDocPackage rdp in dpe.Childs)
    {
        rdp.IsEditable = true;
    }
}
private void Button_Click(object sender, RoutedEventArgs e)
    {
        TreeViewItem treeViewItemFound = GetItem(MyTreeview, MyTreeview.SelectedItem);
        ContentPresenter header = treeViewItemFound.Template.FindName("PART_Header", treeViewItemFound) as ContentPresenter;
        if (header != null)
        {
            TextBox myTextBox = (TextBox)header.ContentTemplate.FindName("MyTextBox", header);
        }
    }

    public TreeViewItem GetItem(ItemsControl container, object itemToSelect)
    {
        foreach (object item in container.Items)
        {
            if (item == itemToSelect)
            {
                return (TreeViewItem)container.ItemContainerGenerator.ContainerFromItem(item);
            }
            else
            {
                ItemsControl itemContainer = (ItemsControl)container.ItemContainerGenerator.ContainerFromItem(item);
                if (itemContainer.Items.Count > 0)
                {
                    TreeViewItem treeViewItemFound = GetItem(itemContainer, itemToSelect);
                    if (treeViewItemFound != null)
                        return treeViewItemFound;
                }
            }
        }

        return null;
    }