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(是为菜单项创建的,但在调用其他行上的上下文菜单时永远不会重新分配。

Caliburn.Micro and ContextMenu for DataGrid Row

您应该利用操作消息的冒泡功能来更轻松、更优雅地处理此问题。

与其在每个RowViewModel实例上放置SomeMethod(),不如将其放在DataGrid本身的DataContext上,然后更改SomeMethod()签名,以便我将RowViewModel作为参数,这当然是每行的DataContext,所以现在它看起来像这样SomeMethod(RowViewModel rowViewModel),然后在 XAML 中使用cal:Message.Attach="SomeMethod($dataContext)"

之后,您应该配置ContextMenu,以便它向其发送冒泡的操作消息,以便它们到达DataGridDataContext,但这很棘手,需要四处寻找。

看看这个问题和这个问题,了解更多关于这样做的信息。