如何获取 TreeViewItem 的 ContextMenu,将 TreeView 作为 DataTemplate
Posted
技术标签:
【中文标题】如何获取 TreeViewItem 的 ContextMenu,将 TreeView 作为 DataTemplate【英文标题】:How to get TreeViewItem's ContextMenu, having TreeView as a DataTemplate 【发布时间】:2021-10-15 03:30:56 【问题描述】:我在这样的数据模板中有一个 TreeView:
<DataTemplate DataType="x:Type MainFavoriteItems">
<TreeView BorderThickness="0">
<TreeViewItem Header="First Header" ItemsSource="Binding FavItems" ItemTemplate="StaticResource item_template"/>
<TreeViewItem Header="Second Header" ../>
<TreeViewItem Header="Third Header" ../>
<TreeView.ItemContainerStyle>
<Style TargetType="x:Type TreeViewItem" BasedOn="StaticResource x:Type TreeViewItem">
<Setter Property="ContextMenu" Value="Binding GetMenu"/> // DO not work
</TreeView.ItemContainerStyle>
</TreeView>
</DataTemplate>
internal class MainFavoriteItems
public IReadOnlyList<Info> FavItems
get
List<Info> items = new List<Info>();
items.Add(new InnerViewModel("1"));
items.Add(new InnerViewModel("2"));
NotifyPropertyChanged(() => FavItems);
return items;
public class InnerViewModel
public string Id;
public System.Windows.Controls.ContextMenu GetMenu => new CustomContextMenu();
...
当我运行它时,标题及其子项看起来很好,但内部项目的右键单击 ContextMenu 没有显示,并且它的 xaml 输出错误说.. GetMenu property not found on object 'MainFavoriteItems' .. 我在做什么错误的 !?谢谢。
【问题讨论】:
【参考方案1】:您的示例代码甚至无法编译,但您应该将 TreeViewItem
的 ItemContainerStyle
设置为 ItemsSource
以使绑定生效:
<TreeViewItem Header="First Header" ItemsSource="Binding FavItems"
ItemTemplate="StaticResource item_template">
<TreeViewItem.ItemContainerStyle>
<Style TargetType="x:Type TreeViewItem" BasedOn="StaticResource x:Type TreeViewItem">
<Setter Property="ContextMenu" Value="Binding GetMenu"/>
</Style>
</TreeViewItem.ItemContainerStyle>
</TreeViewItem>
<TreeViewItem Header="Second Header" />
<TreeViewItem Header="Third Header" />
【讨论】:
以上是关于如何获取 TreeViewItem 的 ContextMenu,将 TreeView 作为 DataTemplate的主要内容,如果未能解决你的问题,请参考以下文章
获取 TreeView 中所选项目的 TreeViewItem
wpf中的treeview如何增加2级节点?在C#中如何添加?