如何在使用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;
}
答案 0 :(得分:1)
我意识到这是一篇旧帖子,但有人可能会发现这很有用。假设您已将视图绑定到视图模型,然后可以通过以下方式将ContextMenu.DataContext
绑定到视图模型:
首先,为您的观点命名UserControl
...为了简单起见,我通常将我的所有内容命名为This
。然后记住我们的视图模型绑定到DataContext
的{{1}},我们可以使用UserControl
绑定到视图模型。
所以现在我们可以绑定到视图模型,我们必须将它与{Binding DataContext, ElementName=This}
连接起来。我将对象的ContextMenu.DataContext
属性与Tag
(ContextMenu
)用作该连接,在此示例中为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}}绑定,或者在这种情况下绑定到DataContext
。 PlacementTarget
的{{1}}将从Grid
继承,因此您的数据项现在已绑定到DataContext
中的Grid
参数,如果您是使用DataTemplate
接口的一些实现:
object
或者,如果您在视图模型中直接使用某种Command
代理:
ICommand