我在WPF ContextMenu
中有一个DataGridRow
。
<ContextMenu x:Key="RowContextMenu">
<MenuItem cal:Message.Attach="SomeMethod()"/>
</ContextMenu>
<Style x:Key="RowWithContextMenu" TargetType="{x:Type DataGridRow}">
<Setter Property="ContextMenu" Value="{StaticResource RowContextMenu}" />
</Style>
DataGrid
中的每一行代表一个单独的视图模型类实例。我们称之为RowViewModel
。当我单击菜单项时,第一次执行SomeMethod()
并且一切正常,但是对于第一次显示SomeMethod()
的行,单击其他行上的菜单项会执行ContextMenu
时间。
我在CM的ActionMessage.cs
源代码中添加了一些断点,发现第一次单击鼠标右键显示菜单会调用事件调用ElementLoaded()
方法,后者又调用UpdateContext()
。因此,为菜单项创建了上下文(它是RowViewModel
),但在其他行上调用上下文菜单时,它永远不会重新分配。
答案 0 :(得分:2)
你应该利用Action Messages的冒泡功能来更轻松,更优雅地处理这个问题。
不应将SomeMethod()
放在每个RowViewModel
个实例上,而应将其放在DataContext
本身的DataGrid
上,然后更改SomeMethod()
签名,以便我将RowViewModel
作为参数,当然是每行的DataContext
,所以现在它看起来像SomeMethod(RowViewModel rowViewModel)
,然后在XAML中使用cal:Message.Attach="SomeMethod($dataContext)"
。
之后你应该配置ContextMenu
,以便它发送冒泡的动作消息,以便它们到达DataContext
的{{1}},但这很棘手,需要一些环顾四周