gpt4 book ai didi

c# - 将 MenuItems 命令绑定(bind)到 UserControls DataContext

转载 作者:行者123 更新时间:2023-12-03 10:34:12 26 4
gpt4 key购买 nike

我有以下布局:

public class ParentUserControl : UserControl{...}

<ParentNameSpace:ParentUserControl
...
DataContext={Binding MyViewModel ....}
>
<TreeView ...>
<HierarchicalDataTemplate
.... >
<StackPanel>
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="item"
Command="{Binding DataContext.SomeCommandInMyViewModel,
RelativeSource={RelativeSource
AncestorType={x:Type ParentUserControl}}}"/>
</ContextMenu>
</StackPanel.ContextMenu>
<TextBlock Text="{Binding Path=Name}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView>

我试图从 TreeViewItem 的上下文中调用 UserControls ViewModel 的命令,但没有成功。它告诉我在 wpf 项目中不支持 ParentUserControl。如果我将 AncestorType 更改为 UserControl,则不会调用 Command。有什么我想念的吗?

最佳答案

这是因为 ContextMenu不是视觉树的一部分。不更改代码隐藏的最简单方法是:

ParentUserControl 起个名字:

<ParentNameSpace:ParentUserControl x:Name="ParentRoot" ... >

使用此绑定(bind):
Command="{Binding Source={x:Reference Name=ParentRoot}, Path=DataContext.SomeCommandInMyViewModel}"

更新 不使用 x:Name属性。

您可以使用 ContextMenu.PlacementTarget属性,它将指向 StackPanel在你的情况下。然后你可以使用它的 Tag用于访问您的 View 模型的属性。
<StackPanel Tag="{Binding RelativeSource={RelativeSource AncestorType=ParentNameSpace:ParentUserControl}, Path=DataContext}">

和命令:
Command="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.Tag.SomeCommandInMyViewModel}"

关于c# - 将 MenuItems 命令绑定(bind)到 UserControls DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615606/

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