我的UserControl
内有Button
,左键点击后会打开ContextMenu
。我正在尝试将UserControl
的父Window
作为参数传递给ContextMenu
项目的命令以关闭该窗口,但无济于事。我已使用RelativeSource
和PlacementTarget
尝试了所有内容,但参数始终为null。我知道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>
Command是UserControl.Resources
中定义的Referenced命令:
<my:CommandReference x:Key="exit" Command="{Binding Exit}" />
并且触发了Execute部分,但参数始终为null。所以,我的问题是,将父窗口绑定为CommandParameter
MenuItem
的正确方法是什么。感谢任何帮助,因为这件事困扰了我差不多两天。
答案 0 :(得分:1)
这里的正确方法是不将父Window
作为CommandParameter
传递给VM。如果这是MVVM,你应该使用Messenger(MVVM Light)/ EventAggregator(Prism)方法在触发命令关闭它时向Window
的代码隐藏发送消息。
在VM中引用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" />
...
<强>更新强>
从ContextMenu
执行“退出”命令时,您应在输出窗口中看到Sender Object: MvvmLight16.MainWindow
。此输出从VM发送。