- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试根据 MVVM 中的分层数据模板在 TreeView 中设置上下文菜单。根是一个父 View 模型,它在一个可观察的集合中嵌套了 View 模型等等。根基于我的主视图模型
例子:
我尝试做的是在一个名为“删除”的孙子上设置一个上下文菜单。我遇到的问题是,当命令位于 subview 模型中时,如何在上下文菜单中设置命令?因为所有孙子都存储在 subview 模型中的可观察集合中。我尝试了此处发布的几种解决方案,但对我没有任何帮助。
到目前为止我尝试过的:
但是我得到了错误:
找不到与引用“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/
这是代码: item1
我有一个作为 excel 插件运行的 WPF 应用程序,它有这样的可视化树 精益求精 元素主机 WPF 用户控件 WPF 色带条控件 现在,在 excel 中加载插件时,不会启用位于 WPF 功能区栏
是 FindAncestor在Window的整个Visual树中搜索一个元素? 如果是,那我该如何改进呢? 是 binding data error如果我们通过使用 Find Ancestor 找到一
FindAncestor 的一件特别的事情让我很困惑,看看下面的例子:
我是 WPF 和 MVVM 模式的新手,所以我的绑定(bind)有一些问题。 在客户的详细信息 View 中,我想在组合框中列出一些状态。 在我的 ViewModel 中,客户处于根级别,状态列表也是
对于以下 MultiBinding 表达式,如果多次更改 PropB,绑定(bind)引擎将搜索 DataGrid 祖先多少次? 如果 PropertyC(及其路径)
本文整理了Java中org.carewebframework.ui.zk.ZKUtil.findAncestor()方法的一些代码示例,展示了ZKUtil.findAncestor()的具体用法。这些
我有一个绑定(bind)到对象的 ItemsControl,在 ItemsControl 的数据模板中,我有两个文本 block ,我想将第一个文本 block 的文本属性绑定(bind)到位于此 I
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
我正在创建一个 MVVM 应用程序,它有两个 View 模型,RegisterUserViewModel 和 UserViewModel。 “RegisterUserViewModel”有一个公共(p
这个问题在这里已经有了答案: How to hide wpf datagrid columns depending on a property (5 个回答) 9年前关闭。 我收到此错误: Canno
我目前正在 WPF 用户控件中工作(我的 XAML 文件的根元素是“UserControl”),我知道该控件托管在 Window 内。如何使用数据绑定(bind)访问窗口的属性? 有谁知道为什么 不
我有一个订单列表,当订单状态为已取消时,我想使文本闪烁。到目前为止,我的代码有效。然而,有时它会抛出异常: WinRT information: Cannot resolve TargetName l
我的问题是关于将一个元素的属性正确绑定(bind)到另一个元素。 这是我的代码的结构: 数据模板包含一个网格(我们称之为网格 GridA),在网格中,我指定了一个控件的实例,称为 ControlA
我正在尝试使用 WPFToolkit 的 DataGrid 控件(和 C#/.Net 3.5)来显示每条记录的 ComboBox。使用下面的代码,组合框会显示出来,但它们的下拉菜单不包含任何项目:
我正在制作一个列表框的模板。我喜欢仅在项目被选中时显示路径。 数据模板: ...
我正在制作一个列表框的模板。我喜欢仅在项目被选中时显示路径。 数据模板: ...
我从下面的代码中得到以下错误...不知道为什么(是的,它产生所有 4 个,即使它是相同的 2 个重复)。哦,它不会产生交替行效果,即使在弹出这些错误之前相同的代码正在运行。 System.Window
有人知道 XAML 绑定(bind)中 FindAncestor 的“新方式”是什么吗?查看RelativeSourceMode ( http://msdn.microsoft.com/en-us/l
我写了样式: 仅当对包含此 ListBoxItem 的 ListBox 应用分组时才相关。但是,大多数时候它不在分组中,这会导致数十、数百和数千个绑定(bind)异常(取
我是一名优秀的程序员,十分优秀!