- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 TreeView
和 HierarchicalDataTemplate
。在 TreeView
我有 ContextMenu
<TreeView Name="_packageTreeView" ItemsSource="{Binding PackageExtendedList}" Behaviors:TreeViewInPlaceEditBehavior.IsEditable="True">
<TreeView.ContextMenu>
<ContextMenu StaysOpen="true">
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</TreeView.ContextMenu>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Childs}">bla bla bla</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
如您所见,我将 Command
绑定(bind)到菜单项。像往常一样在 ViewModell 类中定义的 AddPackageCommand。调用命令工作正常,但我在 CommandParameter
中始终有 null
。我发现了一些类似于我的问题,但我不明白解决方案。例如:
CommandParameters in ContextMenu in WPF
无论如何它对我不起作用:(我做错了什么?
已更新
这似乎有效,但都是一样的,我不明白为什么 CommandParameter
不适用于 TreeView.Name
。
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
例如,这样的示例可以正常工作
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding PackageTreeItemChangeCommand}" CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"/>
</i:EventTrigger>
这是什么鬼...
无论如何,我在 CommandParameter
中有 TreeView
对象,而不是 TreeViewItem
。我可以从 TreeView
获取 SelectedItem
,但如何才能将 TreeViewItem
作为 CommandParameter
准确发送?
谢里丹
问题是为什么这不起作用。
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"
这行得通
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
为什么 有时我可以使用直接的 TreeView 控件名称,有时我不能。据我了解,TreeView
控件和 ContextMenu
的 DataContext 不同,因为 ContextMenu
有自己的 VisualTree,它不是 的一部分TreeView
ViaualTree
.
不幸的是,这种方法也行不通,我又遇到了null
。当然,我设置了 TreeView.Tag。
<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={
RelativeSource Self}}" StaysOpen="true">
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
这是最简单的方法,但如果我在 ViewModel 中有 SelectedItem 属性,将它绑定(bind)到 CommandParameter
是没有意义的,因为我已经在 ViewModel 中拥有它。
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
最佳答案
您向我们展示了您已经有了答案...您到底为什么要发布关于同一主题的另一个问题,而不是简单地按照答案中的示例进行操作?它对您不起作用,因为您没有正确复制答案。
在您的示例帖子答案中,Tag
属性设置为 TreeView
控制应用菜单,但你还没有这样做。
你的下一个问题是你忽略了这个 Tag
属性(property)再次在CommandParameter
...不知何故,您已将其从正确答案更改为:
CommandParameter="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type ContextMenu}}}
在你的问题中:
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type ContextMenu}}}"
您只需复制并粘贴即可。尽管如此,您这样做可能会更幸运:
<TreeView Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"
Name="_packageTreeView" ItemsSource="{Binding PackageExtendedList}"
Behaviors:TreeViewInPlaceEditBehavior.IsEditable="True">
<TreeView.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={
RelativeSource Self}}" StaysOpen="true">
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</TreeView.ContextMenu>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Childs}">bla bla bla</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
查看TreeView.Tag
属性...这是设置为它自己的 DataContext
,这意味着设置为 DataContext
的任何内容的 TreeView
现在可以在 Tag
中找到属性对象。
接下来看ContextMenu.DataContext
属性...这设置为 Tag
PlacementTarget
的属性(property), 这是 ContextMenu
的控件适用于或在本例中适用于 Treeview
.
如果您还没有算出,这意味着 DataContext
的 ContextMenu
现在设置为与 DataContext
相同的对象的 TreeView
.如果这不是您想要的,因为您的 Command
在不同的对象上,然后只需更改 Binding
Tag
中的路径属性指向具有 Command
的对象所在的位置是。
为了简化这个过程,您可以做的最后一件事是向您的 View 模型/代码添加一个绑定(bind)到 TreeView.SelectedItem
的属性。属性:
<TreeView SelectedItem="{Binding SelectedItem}"... />
然后您可以简单地为您的 CommandParameter
引用此属性:
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
当然,这最后一部分假设您已将 View 模型/代码设置为 Tag
TreeView
的属性(property).如果你还不明白这个,看看Context Menus in WPF WPF Tutorial.NET 上的页面。
更新>>>
我只是不明白你为什么提出这个问题。首先你说你不能做某事,但随后在另一篇文章中为我们提供了指向有效解决方案的链接。在尝试帮助你之后,你又说它确实有效,但你不知道为什么......但你又正确地回答了你自己的问题:
As I understand, matter is different DataContext of TreeView control and ContextMenu because ContextMenu has its own VisualTree and it is not the part of TreeView ViaualTree.
如您所说,ContextMenu
有自己的视觉树。这意味着它不知道另一个可视化树中的控件,无论是否命名。但是,如果 ContextMenu.DataContext
提供了一个对象,例如包含 View ,然后它可以知道另一个可视化树中的控件(更具体地说, View 中控件的可视化树)。
这整个问题似乎归结为您对 Binding
缺乏了解一般和Binding.Path
语法更具体。请查看 MSDN 上的以下文章以获得有关此主题的更多帮助:
RelativeSource MarkupExtension
很多人在会走路之前尝试用 WPF 运行。
关于WPF TreeView 上下文菜单命令参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19133654/
我在一页上有两个 Kendo UI TreeViews。例如: var data1 = new kendo.data.HierarchicalDataSource({ data: [
使用 Vuetify 的 TreeView 组件时,我试图能够选择父级 没有 让它也选择所有的后代( child )。我尝试了可选、可激活等的各种组合……但似乎找不到合适的组合。 任何人都有实现这一预
在我的应用程序中,左侧有一个 TreeView,我根据 TreeView 中的选择更新右侧的 Pane 。一个非常直接的场景。当选择为空时,我会在 Pane 中显示一条类似“请进行选择”的消息,即我还
我有一个我自己无法解决的问题。请帮忙。 我有(有条件地): /** @mainpage A @subpage B */ /** @page B @subpage C */ /** @page C */
我制作了一个高度为 40 px 的自定义树单元。 这里的问题披露三角形没有垂直居中对齐。 这里是树单元的代码: public static class TestObjectCell extends A
我正在学习如何使用 kotlin 并已开始使用tornadoFX。我正在阅读该指南以尝试学习它,但是我无法弄清楚“具有不同类型的 TreeView”中的含义。似乎是说我应该使用星形投影,据我所知,当您
如何在 JavaFX 2 TreeView 中过滤节点? 我有一个 TextField,我想根据 TextField 的内容过滤所有节点(例如节点标签)。 谢谢。 最佳答案 这是我编写的可重用的可过滤
我正在通过查询 sharepoint 用户配置文件构建一个 asp.net TreeView 。要选择的帐户名和根节点帐户名正在从查询字符串中读取。 我还需要为树配置可配置的扩展深度。 如果节点属于第
我使用的是 JavaFX 8,目前正在进行一些 GUI 开发。我的 TreeView 有点问题,我需要你的帮助。 您知道在 TreeView 中是否可以只选择标签而不是 TreeCell 的整个宽度吗
我有很多(分层的)数据显示在 TreeView 中(可能是大约 20K 项或更多,包括子项)。我的数据的特殊问题是 TreeView 中显示的每个对象都可以存在于许多 TreeView 项目中。我的意
有没有什么简单的方法可以让 Gtk.Treeview 在编辑时更新它的列? 我基于 Gtk.ListStore 模型构建了 Treeview。我这样初始化单元格: Gtk.CellRendererTe
我开始使用 javafx。我有一个问题。我有一个树 View ,其中节点通过外部命令改变了他的位置,但它只是看不到树。我必须最小化父级并重新展开才能看到效果。 Altem 对该树 View 的任何建议
如何在 Kendo Treeview 中取消选择节点? 我尝试从节点中删除类“k-state-selected”。它工作正常,但有没有直接的方法可以做到这一点。 最佳答案 现在有一种更好的方法可以取消
我有以下情况,我有一个带有许多嵌套子节点的父节点。只有父节点应该有一个复选框,我发现的唯一例子是只有子节点有一个复选框。这可以使用 Kendo 模板吗? http://dojo.telerik.com
我正在尝试向 TreeView 数据项添加一些内联图标,但是 k-template 指令似乎没有呈现任何内容。 我基于在线文档在 http://demos.telerik.com/k
我有一个带有复选框和父节点和子节点的 Kendo Treeview 。 我需要将选中节点的完整层次结构复制到另一个 Treeview 中。 ex - 根节点、父节点和选中的子节点。 下面是我的代码,但
我需要在较大的滚动 Pane 中使用 JavaFX 2.2 TreeView 控件,该滚动 Pane 具有多个不属于 Treeview 的其他元素。问题是 TreeView 有它自己的内置滚动 Pan
当我通过单击 TreeView 节点右侧的加号来展开该节点时,该节点将被选中。我怎样才能避免这种情况?我希望能够在不更改所选节点的情况下展开节点(例如在 RegEdit.exe 中),并且仅在单击节点
我正在尝试设置一个 Treeview 对象,设置节点,然后更新控件以使值具有适当的格式。现在我有以下代码,当我设置一个控件时,它可以工作,但不是来自变量的控件。如何从变量设置本地控件? Private
如何将节点填充到作为另一个 treeview1 实例的 newtreeview1 中?添加到“newtreeview1”的节点应该在 treeview1 的第一个实例中可用? 例如;如果 treevi
我是一名优秀的程序员,十分优秀!