【问题标题】:Context Menu MenuItem Click Data Context?上下文菜单 MenuItem 单击数据上下文?
【发布时间】:2015-06-01 00:20:50
【问题描述】:

我有一组对象,我创建了一个 ScrollViewer 来显示这些对象。对于每个对象,数据都显示在我添加了上下文菜单的网格中,因此当用户右键单击网格时,他们可以更改对象的属性。我无法弄清楚如何知道右键单击了哪个对象。

在下面的代码中,我如何知道哪个“VoltageMonitor”在到达 MenuItem“TurnOff”的回调时被右键单击?

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Hidden" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.ColumnSpan="2" Margin="0,0,0,15">
        <ItemsControl Name="icVoltageMonitorsPanel" ItemsSource="{Binding AppMonitors.VoltageMonitors, Mode=TwoWay}" Grid.ColumnSpan="2" Padding="0" Margin="0"  Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollViewer}}, Path=ActualWidth}">
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="local:VoltageMonitor">
                    <Grid Height="130" Name="grdIndicator" Width="200" MinWidth="200" MinHeight="130">
                        <Grid.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Edit Format..." />
                                <MenuItem Header="Turn off" Click="MenuItem_Click" DataContext=""/>
                            </ContextMenu>
                        </Grid.ContextMenu>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="30*" />
                            <RowDefinition Height="25*" />
                            <RowDefinition Height="25*" />
                            <RowDefinition Height="25*" />
                            <RowDefinition Height="25*" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="133*" />
                            <ColumnDefinition Width="67*" />
                        </Grid.ColumnDefinitions>

【问题讨论】:

  • 回调方法应该在sender 参数中包含该信息。然后您可以阅读其中的DataContext。不过这不是 MVVMish。
  • 你会如何以“MVVMish”的方式做到这一点?
  • sender 参数只有 Equals、GetHashCode、GetType 和 ToString 方法可用。没有数据上下文
  • 你必须先投射它,(FrameworkElement)sender

标签: c# xaml contextmenu


【解决方案1】:

假设您在视图模型中定义了ICommand,您可以这样做:

<ItemsControl ...>
      <ItemsControl.ItemTemplate>
          <DataTemplate DataType="local:VoltageMonitor">
              <Grid ..>
                  <Grid.ContextMenu>
                      <ContextMenu>
                          <MenuItem Header="Edit Format..." />
                          <MenuItem Header="Turn off" 
                              CommandParameter="{Binding}"
                              Command="{Binding RelativeSource=
                                   {RelativeSource Mode=FindAncestor, 
                                      AncestorType={x:Type ItemsControl}}, 
                                    Path=DataContext.TurnOffCommand}"/>
                      </ContextMenu>
                  </Grid.ContextMenu>

【讨论】:

  • 我也偏向于绑定到项目控件的选定项目。这样,您的绑定命令就无需担心所选项目,因为它由不同的绑定管理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多