上下文菜单中子菜单项的命令绑定
Command Binding of Submenu item in Context Menu
我有一个带有分层数据模板(2 级)的 TreeView。我在具有 3 个级别的树视图的第一级创建了一个上下文菜单。我想将我的视图模型的命令绑定到上下文菜单的第二级。不幸的是,我只能在我的模型中使用命令时才能让它工作,这不是我想要做的......如果可能的话,我想在 XAML.
中完成这一切
我已经测试了给定 here and here 的纯 xaml 解决方案。
在设计器中,"Tag" 带有蓝色下划线
"Cannot resolve Property Tag in data context of type System.Windows.UIElement"
或者,如果我使用 "Parent.PlacementTarget....",设计器会告诉我 PlacementTarget cannot be resolved in the data context of type System.Windows.DependencyObject.
代码是可编译的,但我的命令永远不会到达。
这是我的:
在 ResourceDictionary 中:
<DataTemplate DataType="{x:Type viewModel:UpdateToolViewModel}">
<view:UpdateToolView/>
</DataTemplate>
<DataTemplate x:Key="ToolNameDataTemplate" DataType="{x:Type src:Element}">
<Grid>
<TextBlock Text="{Binding Path=NameProperty.Value}" FontSize="12" />
</Grid>
</DataTemplate>
<HierarchicalDataTemplate x:Key="ToolGroupsDataTemplate" ItemsSource="{Binding Elements}" DataType="{x:Type src:ElementGroup}" ItemTemplate="{StaticResource ToolNameDataTemplate}">
<TextBlock Text="{Binding Path=TextProperty.Value}" FontSize="14" FontWeight="Bold" Tag="{Binding ElementName=UpdateToolControl}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Add Tool" ItemContainerStyle="{StaticResource ToolGroupContextMenuToolsItemStyle}" >
<MenuItem.ItemsSource>
<CompositeCollection>
<MenuItem Header="Add New ..." Command="{Binding PlacementTarget.Tag.DataContext.AddToolCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}" />
<CollectionContainer Collection="{Binding Source={StaticResource AddToolContextMenuSource}}"/>
</CompositeCollection>
</MenuItem.ItemsSource>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
在用户控件中:
<UserControl x:Class="...UpdateToolView" ... Name="UpdateToolControl">
<TreeView Name="ToolTreeView" ItemsSource="{Binding AllElementsInGroups}"
ItemTemplate="{StaticResource ToolGroupsDataTemplate}"
ItemContainerStyle="{StaticResource ToolTreeViewItemStyle}"/>
</UserControl>
我已经准备好在我的模型中使用命令,在我的视图模型中调用一个方法。不太好,但我似乎无法让它以不同的方式工作。
我正想弄清楚如何向 CollectionContainer 项目添加命令,当我发现这个:CollectionContainer Binding(抱歉,它是德语,但 xaml 代码是相关的东西在这里)
现在我在 MenuItem
的 ItemContainerStyle
中添加了命令,突然间整个事情都有效了(尽管 "Tag" 在设计器中仍然带有蓝色下划线):
<converter:ElementToToolTipConverter x:Key="ElementToToolTipConverter"/>
<Style x:Key="ToolGroupContextMenuToolsItemStyle" TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="ItemsSource" Value="{Binding Children}"/>
<Setter Property="ToolTip" Value="{Binding Element, Converter={StaticResource ElementToToolTipConverter}}"/>
<Setter Property="Command" Value="{Binding PlacementTarget.Tag.DataContext.AddToolCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
有时,它已经有助于思考其他事情...:)
我有一个带有分层数据模板(2 级)的 TreeView。我在具有 3 个级别的树视图的第一级创建了一个上下文菜单。我想将我的视图模型的命令绑定到上下文菜单的第二级。不幸的是,我只能在我的模型中使用命令时才能让它工作,这不是我想要做的......如果可能的话,我想在 XAML.
中完成这一切我已经测试了给定 here and here 的纯 xaml 解决方案。 在设计器中,"Tag" 带有蓝色下划线
"Cannot resolve Property Tag in data context of type System.Windows.UIElement"或者,如果我使用 "Parent.PlacementTarget....",设计器会告诉我
PlacementTarget cannot be resolved in the data context of type System.Windows.DependencyObject.代码是可编译的,但我的命令永远不会到达。
这是我的:
在 ResourceDictionary 中:
<DataTemplate DataType="{x:Type viewModel:UpdateToolViewModel}">
<view:UpdateToolView/>
</DataTemplate>
<DataTemplate x:Key="ToolNameDataTemplate" DataType="{x:Type src:Element}">
<Grid>
<TextBlock Text="{Binding Path=NameProperty.Value}" FontSize="12" />
</Grid>
</DataTemplate>
<HierarchicalDataTemplate x:Key="ToolGroupsDataTemplate" ItemsSource="{Binding Elements}" DataType="{x:Type src:ElementGroup}" ItemTemplate="{StaticResource ToolNameDataTemplate}">
<TextBlock Text="{Binding Path=TextProperty.Value}" FontSize="14" FontWeight="Bold" Tag="{Binding ElementName=UpdateToolControl}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Add Tool" ItemContainerStyle="{StaticResource ToolGroupContextMenuToolsItemStyle}" >
<MenuItem.ItemsSource>
<CompositeCollection>
<MenuItem Header="Add New ..." Command="{Binding PlacementTarget.Tag.DataContext.AddToolCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}" />
<CollectionContainer Collection="{Binding Source={StaticResource AddToolContextMenuSource}}"/>
</CompositeCollection>
</MenuItem.ItemsSource>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
在用户控件中:
<UserControl x:Class="...UpdateToolView" ... Name="UpdateToolControl">
<TreeView Name="ToolTreeView" ItemsSource="{Binding AllElementsInGroups}"
ItemTemplate="{StaticResource ToolGroupsDataTemplate}"
ItemContainerStyle="{StaticResource ToolTreeViewItemStyle}"/>
</UserControl>
我已经准备好在我的模型中使用命令,在我的视图模型中调用一个方法。不太好,但我似乎无法让它以不同的方式工作。
我正想弄清楚如何向 CollectionContainer 项目添加命令,当我发现这个:CollectionContainer Binding(抱歉,它是德语,但 xaml 代码是相关的东西在这里)
现在我在 MenuItem
的 ItemContainerStyle
中添加了命令,突然间整个事情都有效了(尽管 "Tag" 在设计器中仍然带有蓝色下划线):
<converter:ElementToToolTipConverter x:Key="ElementToToolTipConverter"/>
<Style x:Key="ToolGroupContextMenuToolsItemStyle" TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="ItemsSource" Value="{Binding Children}"/>
<Setter Property="ToolTip" Value="{Binding Element, Converter={StaticResource ElementToToolTipConverter}}"/>
<Setter Property="Command" Value="{Binding PlacementTarget.Tag.DataContext.AddToolCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
有时,它已经有助于思考其他事情...:)