gpt4 book ai didi

c# - 使用 MVVM,ContextMenu ViewModel 如何找到打开 ContextMenu 的 ViewModel?

转载 作者:太空狗 更新时间:2023-10-29 18:17:15 26 4
gpt4 key购买 nike

我正在使用 MVVM 将 View 绑定(bind)到树中的对象。我有一个实现树中项目的基类,该基类有一个 ContextMenu 属性:

    public IEnumerable<IMenuItem> ContextMenu
{
get
{
return m_ContextMenu;
}
protected set
{
if (m_ContextMenu != value)
{
m_ContextMenu = value;
NotifyPropertyChanged(m_ContextMenuArgs);
}
}
}
private IEnumerable<IMenuItem> m_ContextMenu = null;
static readonly PropertyChangedEventArgs m_ContextMenuArgs =
NotifyPropertyChangedHelper.CreateArgs<AbstractSolutionItem>(o => o.ContextMenu);

绑定(bind)到基类(和所有派生类)的 View 实现绑定(bind)到该属性的上下文菜单:

<ContextMenu x:Name="contextMenu" ItemsSource="{Binding Path=(local:AbstractSolutionItem.ContextMenu)}"
IsEnabled="{Binding Path=(local:AbstractSolutionItem.ContextMenuEnabled)}"
ItemContainerStyle="{StaticResource contextMenuStyle}"/>

菜单中的每个项目都绑定(bind)到 IMenuItem对象(菜单项的 ViewModel)。当您单击菜单项时,它会使用命令在基础对象上执行命令。这一切都很好。

但是,一旦命令在 IMenuItem 类上执行,它有时需要获取对用户右键单击以显示上下文菜单(或至少是该对象的 ViewModel)的对象的引用。这就是上下文 菜单的全部要点。我应该如何将树项 ViewModel 的引用传递给 MenuItem ViewModel?请注意,一些上下文菜单由树中的许多对象共享。

最佳答案

ContextMenu 对象上有一个名为“PlacementTarget”的 DP - 这将设置为上下文菜单附加到的 UI 元素 - 你甚至可以将它用作绑定(bind)源,这样你就可以将它传递给你的命令通过命令参数:

http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.placementtarget.aspx

编辑:在您的情况下,您需要 PlacementTarget 的 VM,因此您的绑定(bind)可能看起来更像:

{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}

关于c# - 使用 MVVM,ContextMenu ViewModel 如何找到打开 ContextMenu 的 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2306386/

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