如何使用MVVM模式单击项目时,如何在WPF上下文菜单上获取PlacementTarget

时间:2011-07-08 07:55:19

标签: wpf mvvm contextmenu

如何在使用MVVM模式时获取所选ContextMenu的PlacementTarget?

使用MenuItem click事件时,我可以像这样获得PlacementTarget。但它如何做MVVM呢?

   public void changeGaugeColor(object sender, RoutedEventArgs e)
    {
        MenuItem tempMenuItem = (MenuItem)sender;

        MenuItem mi = (MenuItem)sender;
        bd = (BidirectionalDial)cm.PlacementTarget;

    }

1 个答案:

答案 0 :(得分:1)

我意识到这是一篇旧帖子,但有人可能会发现这很有用。假设您已将视图绑定到视图模型,然后可以通过以下方式将ContextMenu.DataContext绑定到视图模型:

首先,为您的观点命名UserControl ...为了简单起见,我通常将我的所有内容命名为This。然后记住我们的视图模型绑定到DataContext的{​​{1}},我们可以使用UserControl绑定到视图模型。

所以现在我们可以绑定到视图模型,我们必须将它与{Binding DataContext, ElementName=This}连接起来。我将对象的ContextMenu.DataContext属性与TagContextMenu)用作该连接,在此示例中为PlacementTarget

Grid

然后,我们可以通过将<DataTemplate x:Key="YourTemplate" DataType="{x:Type DataTypes:YourDataType}"> <Grid ContextMenu="{StaticResource Menu}" Tag="{Binding DataContext, ElementName=This}"> ... </Grid> </DataTemplate> 属性绑定到ContextMenu属性(在我们的示例中为ContextMenu.DataContext)来访问PlacementTarget.Tag中的视图模型属性和命令:

Grid

请注意<ContextMenu x:Key="Menu" DataContext="{Binding PlacementTarget.Tag, RelativeSource= {RelativeSource Self}}"> <MenuItem Header="Delete" Command="{Binding DeleteFile}" CommandParameter= "{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu}}" CommandTarget="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}" /> </ContextMenu> 属性上的绑定。设置此选项可确保引发指定命令的目标元素为MenuItem.CommandTarget,或者在此情况下为PlacementTarget

另请注意Grid绑定。这与CommandParameter的{​​{1}}绑定,或者在这种情况下绑定到DataContextPlacementTarget的{​​{1}}将从Grid继承,因此您的数据项现在已绑定到DataContext中的Grid参数,如果您是使用DataTemplate接口的一些实现:

object

或者,如果您在视图模型中直接使用某种Command代理:

ICommand