我试图根据MVVM中的分层数据板在treeview中设置上下文菜单。根是一个父视图模型,它在一个可观察集合中嵌套了视图模型,等等。根目录基于我的主要视图模型。
示例:
- Child 2
- Grand Child 1
- Child 3
我想做的是在一个名为"Delete“的大孩子上设置一个上下文菜单。当命令位于子视图模型中时,我遇到的问题是如何在上下文菜单中设置命令?因为所有的大孩子都被存储在儿童模型中的一个观察集中。我尝试了几个在这里发表的解决方案,但对我来说没有什么效果。
我试过的是:
但我发现了错误:
无法找到与引用“RelativeSource FindAncestor,RelativeSource AncestorLevel=‘1’”绑定的源代码。BindingExpression:(无路径);DataItem=null;目标元素为'StackPanel‘(名称=’‘);目标属性为'Tag’(键入'Object')
以下是treeview的xaml代码:
<TreeView Name="Tree" ItemsSource="{Binding Projects}" Background="#cccccc" BorderThickness="0" >
<i:Interaction.Behaviors>
<behav:TreeViewSelectedItemBehavior SelectedItem="{Binding SelectedTreeViewItem}"/>
</i:Interaction.Behaviors>
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Background" Value="Transparent"/>
<EventSetter Event="MouseRightButtonDown" Handler="TreeViewItem_MouseRightButtonDown"/>
</Style>
</TreeView.Resources>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding VirtualPLCs}">
<StackPanel Orientation="Horizontal">
<Image Source="/SimTableApplication;component/Assets/ICO_PE_Project.ico" Height="18" Width="18"/>
<TextBlock Text="{Binding ProjModel.ProjectName}" Margin="3"/>
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Add new Controller" Command="{Binding AddNewControllerCommand}">
<MenuItem.Icon>
<Image Source="/SimTableApplication;component/Assets/ICO_PE_CreateNewItem.ico"/>
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem Header="Properties" Command="{Binding ShowProjectPropertiesCommand}">
<MenuItem.Icon>
<Image Source="/SimTableApplication;component/Assets/ICO_PVS_Properties.png"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding SimTables}">
<StackPanel Orientation="Horizontal">
<Image Source="/SimTableApplication;component/Assets/ICO_PE_Device.ico" Height="18" Width="18"/>
<TextBlock Text="{Binding Name}" Margin="3"/>
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Add new SIM table" Command="{Binding AddNewSimTableCommand}">
<MenuItem.Icon>
<Image Source="/SimTableApplication;component/Assets/ICO_PE_CreateNewItem.ico"/>
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem Header="Power On" Command="{Binding PowerOnCommand}">
<MenuItem.Icon >
<Image Source="/SimTableApplication;component/Assets/ICO_PLCSIM_Tbon.ico "/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Power Off" Command="{Binding PowerOffCommand}">
<MenuItem.Icon >
<Image Source="/SimTableApplication;component/Assets/ICO_PLCSIM_Tboff.ico "/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Run" Command="{Binding RunCommand}">
<MenuItem.Icon >
<Image Source="/SimTableApplication;component/Assets/StartSimulation.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Stop" Command="{Binding StopCommand}">
<MenuItem.Icon >
<Image Source="/SimTableApplication;component/Assets/StopSimulation.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="MRES" Command="{Binding ResetMemoryCardCommand}">
<MenuItem.Icon >
<Image Source="/SimTableApplication;component/Assets/reset-icon.png"/>
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem Header="Delete">
<MenuItem.Icon>
<Image Source="/SimTableApplication;component/Assets/ICO_PE_TbDelete.ico"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
<HierarchicalDataTemplate.ItemTemplate >
<DataTemplate >
<StackPanel Orientation="Horizontal" **Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}">**
<Image Source="/SimTableApplication;component/Assets/ICO_PLCS_SimTable.ico" Height="18" Width="18"/>
<TextBlock Text="{Binding SimTableName}" Margin="3"/>
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" Command="{Binding Path=PlacementTarget.Tag.DataContext.DeleteSimTableCommand,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}">
<MenuItem.Icon>
<Image Source="/SimTableApplication;component/Assets/ICO_PE_TbDelete.ico"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>也许有人能告诉我我做错了什么。
发布于 2018-03-23 11:36:19
我认为你的问题是因为你试图同时做相对源绑定和定位目标。我想我从来没有像预期的那样成功过。我通常所做的是将placementtarget的标记绑定到我要从哪里获取命令,然后我就可以这样做了。这可能是一个问题,如果你有其他命令在控制菜单,但你没有。我没有你所有的代码,所以我把一些东西,只有两个层次-父母和孩子。子文件是叶,父命令与删除命令的位置相等。这对我来说很管用:
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
<Grid>
<TreeView ItemsSource="{Binding Parents}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Parent}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:Child}">
<StackPanel Tag="{Binding DataContext,
RelativeSource={RelativeSource AncestorType=TreeViewItem , AncestorLevel=2}
}"
>
<StackPanel.ContextMenu>
<ContextMenu DataContext="{Binding Path=PlacementTarget.Tag,
RelativeSource={x:Static RelativeSource.Self}}">
<MenuItem Header="Delete" Command="{Binding DeleteCommand}">
</MenuItem>
</ContextMenu>
</StackPanel.ContextMenu>
<TextBlock Text="{Binding ChildName}"/>
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>标签在可视树中,所以它可以做相对源的事情,OK,然后命令在放置目标的标记中。如果还不清楚,我可以公布样本。
对delete的密钥绑定会更简单,我想这对你没有好处。
https://stackoverflow.com/questions/49447029
复制相似问题