WPF中DataGrid行上下文菜单DataContext绑定错误的解决咨询
这个问题的核心原因是:ContextMenu是脱离可视化树的独立元素,当你把它赋值给DataGridRow的ContextMenu属性时,它的DataContext会自动继承自DataGridRow的绑定对象(也就是你的CaseObject实例),而你的CurrentLang是在窗口的AdminViewModel里,自然找不到对应的属性。
下面给你几种靠谱的解决方案,按需选择:
方案1:在MenuItem绑定中直接引用窗口的DataContext
不用修改ContextMenu的整体DataContext,直接在MenuItem的Header绑定里通过RelativeSource找到窗口,获取它的DataContext:
<Controls:MetroWindow.Resources> <ContextMenu x:Key="RowContextMenu"> <MenuItem Header="{Binding DataContext.CurrentLang.CmenuItemUnLockUser, RelativeSource={RelativeSource AncestorType={x:Type Controls:MetroWindow}}}" /> </ContextMenu> </Controls:MetroWindow.Resources>
这种方法的好处是不需要给窗口命名,适合不想额外加命名的场景。
方案2:给窗口命名后用ElementName绑定
先给你的MetroWindow加上x:Name:
<Controls:MetroWindow x:Name="AdminMainWindow" ...> <!-- 其他内容 --> </Controls:MetroWindow>
然后在MenuItem的绑定里用ElementName指向窗口,获取它的DataContext:
<ContextMenu x:Key="RowContextMenu"> <MenuItem Header="{Binding DataContext.CurrentLang.CmenuItemUnLockUser, ElementName=AdminMainWindow}" /> </ContextMenu>
这种方法可读性更强,适合团队协作时让其他开发者一眼看懂绑定来源。
方案3:直接设置ContextMenu的DataContext为窗口VM
如果你的ContextMenu里有多个MenuItem都需要用到窗口VM的属性,直接给ContextMenu本身设置DataContext会更方便:
<Controls:MetroWindow.Resources> <ContextMenu x:Key="RowContextMenu" DataContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type Controls:MetroWindow}}}"> <MenuItem Header="{Binding CurrentLang.CmenuItemUnLockUser}" /> <!-- 其他需要绑定窗口VM属性的MenuItem --> </ContextMenu> </Controls:MetroWindow.Resources>
这样整个ContextMenu下的控件都能直接绑定AdminViewModel里的属性,不用每个控件都写一遍RelativeSource/ElementName。
内容的提问来源于stack exchange,提问作者Hüsk3rDü
相关产品推荐
相关产品推荐

