WPF UserControl - 将父窗口绑定为ContextMenu MenuItem的命令参数

时间:2013-06-19 10:28:22

标签: wpf mvvm user-controls menuitem commandparameter

我的UserControl内有Button,左键点击后会打开ContextMenu。我正在尝试将UserControl的父Window作为参数传递给ContextMenu项目的命令以关闭该窗口,但无济于事。我已使用RelativeSourcePlacementTarget尝试了所有内容,但参数始终为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的正确方法是什么。感谢任何帮助,因为这件事困扰了我差不多两天。

1 个答案:

答案 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" />
...

<强>更新

Download Link

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