首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法找到引用“RelativeSource FindAncestor,RelativeSource AncestorLevel=‘1’”绑定的源代码

无法找到引用“RelativeSource FindAncestor,RelativeSource AncestorLevel=‘1’”绑定的源代码
EN

Stack Overflow用户
提问于 2018-03-23 10:04:30
回答 1查看 2.1K关注 0票数 3

我试图根据MVVM中的分层数据板在treeview中设置上下文菜单。根是一个父视图模型,它在一个可观察集合中嵌套了视图模型,等等。根目录基于我的主要视图模型。

示例:

  • 亲本
    • 儿童
      • 大孩子1
      • 大孩子2

代码语言:javascript
复制
- Child 2  
    - Grand Child 1

代码语言:javascript
复制
- Child 3

我想做的是在一个名为"Delete“的大孩子上设置一个上下文菜单。当命令位于子视图模型中时,我遇到的问题是如何在上下文菜单中设置命令?因为所有的大孩子都被存储在儿童模型中的一个观察集中。我尝试了几个在这里发表的解决方案,但对我来说没有什么效果。

我试过的是:

  • 使用Tag属性和Placementtarget

但我发现了错误:

无法找到与引用“RelativeSource FindAncestor,RelativeSource AncestorLevel=‘1’”绑定的源代码。BindingExpression:(无路径);DataItem=null;目标元素为'StackPanel‘(名称=’‘);目标属性为'Tag’(键入'Object')

以下是treeview的xaml代码:

代码语言:javascript
复制
 <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>

也许有人能告诉我我做错了什么。

EN

回答 1

Stack Overflow用户

发布于 2018-03-23 11:36:19

我认为你的问题是因为你试图同时做相对源绑定和定位目标。我想我从来没有像预期的那样成功过。我通常所做的是将placementtarget的标记绑定到我要从哪里获取命令,然后我就可以这样做了。这可能是一个问题,如果你有其他命令在控制菜单,但你没有。我没有你所有的代码,所以我把一些东西,只有两个层次-父母和孩子。子文件是叶,父命令与删除命令的位置相等。这对我来说很管用:

代码语言:javascript
复制
<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的密钥绑定会更简单,我想这对你没有好处。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49447029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档