[英]Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='MahApps.Metro.Controls.Glow', AncestorLevel='1''
[英]Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''
我正在尝试基于MVVM中的分层数据模板在树视图中设置上下文菜单。 根是父视图模型,该视图模型在可观察的集合中内部嵌套了视图模型,依此类推。 根基于我的主要viewmodel
例:
我要做的是在名为“删除”的大孩子上设置一个上下文菜单。 我遇到的问题是,当命令位于子视图模型中时,如何在上下文菜单中设置该命令? 因为所有Grand子级都存储在子视图模型的observable集合中。 我尝试了这里发布的几种解决方案,但对我没有任何帮助。
到目前为止我尝试过的是:
但是我得到了错误:
找不到参考'RelativeSource FindAncestor,AncestorType ='SimTableApplication.View.Controls.VirtualControllerView',AncestorLevel ='1''的绑定源。 BindingExpression :(无路径); 的DataItem = NULL; 目标元素是'StackPanel'(Name =''); 目标属性为“标记”(类型为“对象”)
这是我的树视图的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>
也许有人可以给我提示我做错了什么。
我认为您的问题是因为您试图同时进行相对源绑定和PlacementTarget。 我认为我从未设法达到预期效果。 我通常要做的是将placementtarget的标签绑定到要从中获取命令的任何位置,然后就可以到达该位置。 如果您在该上下文菜单中有其他命令,则可能会出现问题,但是您没有。 我没有您所有的代码,因此我只将两个级别(父级和子级)放在一起。 子级是叶子,父级相当于您的delete命令所在的位置。 这对我有用:
<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>
标签在视觉树中,因此它可以做相对源操作,然后命令在放置目标的标签中。 如果不清楚,我可以发布样本。
删除时的键绑定会更简单,但我想这对您不利。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.