ContextMenu命令绑定不在treeview hierarchicaldatatemplate内部工作

时间:2017-12-01 11:16:59

标签: c# wpf treeview

我有一个usercontrol和一个viewmodel。

我在 UserControl.Resources

中定义了上下文菜单

上下文菜单包含一个菜单项。我设置了MenuItem头和命令属性。

DeleteCommand 在viewmodel中定义。 我还使用RelativeSource 将MenuItem的datacontext属性设置为usercontrol。

[不知怎的,这个DataContext绑定似乎没有工作]

在用户控件内部我有treeview,它的ItemSource在viewmodel中定义。 TreeView有ParentNode和子节点。

我只在子节点下显示上下文菜单,为了实现此目的,Treeview使用两个 hierarchicaldatatemplate levelTemplate1 levelTemplate2

当我右键单击子节点时,我可以看到上下文菜单,但是当我点击删除时,DeleteCommand的OnExecute方法没有触发。

代码结构如下:

     <UserControl.Resources>
    <ContextMenu x:Key="childContextMenu" >
        <MenuItem DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext}"
                  Command="{Binding DeleteCommand}"
                  Header="Delete"/>
    </ContextMenu>
</UserControl.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.Resources>
        <HierarchicalDataTemplate x:Key="level2Template">
            <Grid ContextMenu="{StaticResource childContextMenu}">
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding}"/>
            </Grid>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate x:Key="level1Template"
                                  ItemTemplate="{StaticResource level2Template}"
                                  ItemsSource="{Binding childs}"
                                  >
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>


        <Style TargetType="{x:Type TreeViewItem}" x:Key="TreeViewStyle">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
            <Setter Property="FontWeight" Value="Normal" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="FontWeight" Value="Bold" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Grid.Resources>
    <GroupBox Header="Tree" Grid.Column="0">
    <TreeView ItemTemplate="{StaticResource level1Template}"
              ItemsSource="{Binding Groups}"
              ItemContainerStyle="{StaticResource TreeViewStyle}">

    </TreeView>
    </GroupBox>
</Grid>

在输出窗口中显示错误

  

&#34;无法找到与参考&#39; RelativeSource绑定的来源   FindAncestor,AncestorType =&#39; System.Windows.Controls.UserControl&#39;,   AncestorLevel =&#39; 1&#39;&#39;

1 个答案:

答案 0 :(得分:0)

我更改了 level2Template ,如下所示,它检测到删除命令绑定

<HierarchicalDataTemplate x:Key="level2Template">
                <Grid Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=TreeView}}">
                    <Grid.ContextMenu>
                        <ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Delete" Command="{Binding DeleteCommand}"/>
                        </ContextMenu>
                    </Grid.ContextMenu>
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition></ColumnDefinition>
                        <ColumnDefinition></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="{Binding}">
                    </TextBlock>
                </Grid>
            </HierarchicalDataTemplate>
相关问题