如何将命令绑定到项目上 TreeView 内的上下文菜单中?
How to bind command into a context menu that is inside TreeView on it's items?
我希望能够通过单击上下文菜单中的命令对 TreeView 中的项目执行命令。更具体地说,只有当项目是某种类型时(xxTreeViewItem 是一个具有 2 个子类型的接口)。
<Grid Name="Root" commonExtensions:EnterKeyUpdateExtension.IsEnabled="True">
<StackPanel Orientation="Vertical" Grid.Row="0">
<Button Content="Center on" Command="{Binding Path=CenterOnCommand}" Margin="5,10,5,0"/>
</StackPanel>
<Grid>
<TreeView Grid.Row="0" Name="xxTreeView" DataContext="{Binding Path=xxViewModel}" ItemsSource="{Binding Path=Items}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Center On" Command="{Binding CenterOnCommand}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Items}" DataType="{x:Type localViewItems:xxTreeViewItem}">
<TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
顶部按钮中的命令有效,但在上下文菜单中无效。我尝试了几种绑定并找到了祖先,但 none 它有效。有XAML唯一的解决方案吗?
ContextMenu
不属于可视树,所以不继承你的TreeView的DataContext。因此,您需要使用 PlacementTarget 属性:
将其传递给您的 ContextMenu
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=DataContext}"></Setter>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Center On" Command="{Binding CenterOnCommand}" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
希望对您有所帮助
我希望能够通过单击上下文菜单中的命令对 TreeView 中的项目执行命令。更具体地说,只有当项目是某种类型时(xxTreeViewItem 是一个具有 2 个子类型的接口)。
<Grid Name="Root" commonExtensions:EnterKeyUpdateExtension.IsEnabled="True">
<StackPanel Orientation="Vertical" Grid.Row="0">
<Button Content="Center on" Command="{Binding Path=CenterOnCommand}" Margin="5,10,5,0"/>
</StackPanel>
<Grid>
<TreeView Grid.Row="0" Name="xxTreeView" DataContext="{Binding Path=xxViewModel}" ItemsSource="{Binding Path=Items}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Center On" Command="{Binding CenterOnCommand}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Items}" DataType="{x:Type localViewItems:xxTreeViewItem}">
<TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
顶部按钮中的命令有效,但在上下文菜单中无效。我尝试了几种绑定并找到了祖先,但 none 它有效。有XAML唯一的解决方案吗?
ContextMenu
不属于可视树,所以不继承你的TreeView的DataContext。因此,您需要使用 PlacementTarget 属性:
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=DataContext}"></Setter>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Center On" Command="{Binding CenterOnCommand}" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
希望对您有所帮助