gpt4 book ai didi

c# - 找不到引用 'RelativeSource FindAncestor, AncestorType=' System.Windows.Controls.UserControl',AncestorLevel ='1'' 的绑定(bind)源

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:31 24 4
gpt4 key购买 nike

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

例子:

  • 家长
    • child
      • 孙子 1
      • 孙子 2
    • child 2
      • 孙子 1
    • child 3

我尝试做的是在一个名为“删除”的孙子上设置一个上下文菜单。我遇到的问题是,当命令位于 subview 模型中时,如何在上下文菜单中设置命令?因为所有孙子都存储在 subview 模型中的可观察集合中。我尝试了此处发布的几种解决方案,但对我没有任何帮助。

到目前为止我尝试过的:

  • 使用 Tag 属性和 Placementtarget

但是我得到了错误:

找不到与引用“RelativeSource FindAncestor,AncestorType='SimTableApplication.View.Controls.VirtualControllerView',AncestorLevel='1'”绑定(bind)的源。绑定(bind)表达式:(无路径);数据项=空;目标元素是“StackPanel”(名称='');目标属性是“标签”(类型“对象”)

这是 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>

也许有人可以给我提示我做错了什么。

最佳答案

我认为您的问题是因为您试图同时进行相对源绑定(bind)和放置目标。我不认为我曾经设法让它按预期工作。我通常做的是将 placementtarget 的标签绑定(bind)到我要从中获取命令的任何地方,然后我就可以到达那里。如果您在该上下文菜单中有其他命令,但您没有,这可能是个问题。我没有你所有的代码,所以我把一些东西放在一起,只有两个层次—— parent 和 child 。 child 是叶子, parent 相当于您的删除命令所在的位置。这对我有用:

<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>

标签位于可视化树中,因此它可以执行相对来源的事情,然后命令位于放置目标的标签中。如果不清楚,我可以发布示例。

删除时的键绑定(bind)会更简单,但我想这对你没有好处。

关于c# - 找不到引用 'RelativeSource FindAncestor, AncestorType=' System.Windows.Controls.UserControl',AncestorLevel ='1'' 的绑定(bind)源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49447029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com