gpt4 book ai didi

WPF UserControl - 将父窗口作为命令参数绑定(bind)到 ContextMenu MenuItem

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

我有一个 UserControlButton在里面打开一个ContextMenu左键单击时。我正在尝试通过 UserControl的 parent Window作为 ContextMenu 的参数item 的命令关闭该窗口,但无济于事。我用 RelativeSource 尝试了所有方法和 PlacementTarget ,但参数始终为空。我知道 ContextMenu不属于父窗口的VisualTree .我目前坚持使用这种方法,但它不起作用。

<Grid x:Name="LayoutRoot">
<Button
HorizontalAlignment="Left"
Margin="0"
Style="{DynamicResource ButtonStyle1}"
VerticalAlignment="Top"
Width="120"
Height="25"
Content="Dashboard Menu"
TextElement.FontWeight="Bold"
Foreground="AliceBlue"
>

<!--Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={ x:Type Window}}}"-->
<Button.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}" >
<MenuItem Header="Open Log Viewer" Command="{StaticResource openLogViewer}" />
<Separator />
<MenuItem Header="Exit" Command="{StaticResource exit}" CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=Window}}"/>
</ContextMenu>
</Button.ContextMenu>
</Button>
</Grid>

命令是在 UserControl.Resources 中定义的引用命令:
<my:CommandReference x:Key="exit" Command="{Binding Exit}" />

它的执行部分被触发,但参数始终为空。所以,我的问题是,将父窗口绑定(bind)为 CommandParameter 的正确方法是什么?的 MenuItem .任何帮助表示赞赏,因为这件事困扰了我将近两天。

最佳答案

正确的方法是不是 通过父 Window作为 CommandParameter 发送到 VM .如果这是 MVVM,您应该使用 Messenger(MVVM Light)/EventAggregator(Prism) 方法向 Window 发送消息的代码隐藏时触发命令以关闭它。

引用 Window在虚拟机中是完全错误的。

仅供引用,您尝试做的事情“可以做到”

就像是:

<Grid x:Name="LayoutRoot">
<Button HorizontalAlignment="Left"
Margin="0"
Style="{DynamicResource ButtonStyle1}"
VerticalAlignment="Top"
Width="120"
Height="25"
Content="Dashboard Menu"
TextElement.FontWeight="Bold"
Foreground="AliceBlue"
Tag="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}}}">
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="Open Log Viewer" Command="{StaticResource openLogViewer}" />
<Separator />
<MenuItem Command="{StaticResource exit}"
CommandParameter="{Binding PlacementTarget.Tag,
RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
Header="Exit" />
...

更新:

Download Link

ContextMenu 执行“退出”命令时你应该看到 Sender Object: MvvmLight16.MainWindow在您的输出窗口中。此输出是从 VM 发送的。

关于WPF UserControl - 将父窗口作为命令参数绑定(bind)到 ContextMenu MenuItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17188913/

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