Caliburn.Micro and ContextMenu for DataGrid Row
本文关键字:DataGrid Row for ContextMenu Micro and Caliburn | 更新日期: 2023-09-27 18:27:15
我在 WPF DataGridRow
中有一个ContextMenu
。
<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
(是为菜单项创建的,但在调用其他行上的上下文菜单时永远不会重新分配。
您应该利用操作消息的冒泡功能来更轻松、更优雅地处理此问题。
与其在每个RowViewModel
实例上放置SomeMethod()
,不如将其放在DataGrid
本身的DataContext
上,然后更改SomeMethod()
签名,以便我将RowViewModel
作为参数,这当然是每行的DataContext
,所以现在它看起来像这样SomeMethod(RowViewModel rowViewModel)
,然后在 XAML 中使用cal:Message.Attach="SomeMethod($dataContext)"
。
之后,您应该配置ContextMenu
,以便它向其发送冒泡的操作消息,以便它们到达DataGrid
的DataContext
,但这很棘手,需要四处寻找。
看看这个问题和这个问题,了解更多关于这样做的信息。