Loading

wpf-mvvm开发学习3 关于ContextMenu的DataContext绑定

在MVVM模式下 关于ContextMenu的DataContext绑定问题

参考链接:

https://blog.csdn.net/WPwalter/article/details/83473313

https://blog.csdn.net/Backspace110/article/details/109630129

情景

xaml结构

image-20220526111233053

我为Grid指定了一个DataContext

希望Listboxitem的ContextMenu也使用该DataContext

希望将菜单项绑定到viewmodel的命令上

但是绑定总是失败 DataContext并不符合预期

查找原因是ContextMenu并不存在于可视化树中

如下图 绑定是失败的 VS认为绑定到了Model 而我们的命令接口在viewmodel

image-20220526110841393

所以解决方案应该是让binding指向正确的路径

解决方案

为该Grid指定名字

并创建资源用于代理

image-20220526111700822

<Grid.Resources>
    <DiscreteObjectKeyFrame x:Key="proxy" Value="{x:Reference Name=processmangergrid}" />
</Grid.Resources>

接下来再指定ContextMenu的DataContext

image-20220526111847707

<ContextMenu DataContext="{Binding Source={StaticResource proxy}, Path=Value.DataContext}">
    <MenuItem Command="{Binding Path=RefeshProcessCommand}" Header="刷新进程" />
</ContextMenu>

关于该ContextMenu的参数传递问题

还是常规操作

viewmodel中先定义该命令接口

public ICommand KillProcessItemCommand { get; }
void KillProcessItemExecute(ListBoxItem tItem)
{
    //函数功能实现
}
//构造函数
public myProcessViewModel()
{
    KillProcessItemCommand = new RelayCommand<ListBoxItem>(KillProcessItemExecute);
}

这里使用ContextMenu.PlacementTarget来解决定位问题

官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.contextmenu.placementtarget?view=windowsdesktop-6.0

简单来说ContextMenu.PlacementTarget就是召出它的元素

预期是将该listboxitem当作参数传入

使用如下命令即可

CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget}"

(因为我将ContextMenu绑定在了listboxitem上 所以path直接指向PlacementTarget即可

如果将ContextMenu绑定在listbox上 可以令path指向PlacementTarget.SelectedItem

posted @ 2022-05-26 17:21  FW_ltlly  阅读(557)  评论(0编辑  收藏  举报