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

作者:FW-ltlly

出处:https://www.cnblogs.com/FW-ltlly/p/16314076.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   FW_ltlly  阅读(641)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示