DataGrid Row的Caliburn.Micro和ContextMenu

时间:2013-08-12 10:18:54

标签: c# wpf caliburn.micro

我在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,但在其他行上调用上下文菜单时,它永远不会重新分配。

1 个答案:

答案 0 :(得分:2)

你应该利用Action Messages的冒泡功能来更轻松,更优雅地处理这个问题。

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

之后你应该配置ContextMenu,以便它发送冒泡的动作消息,以便它们到达DataContext的{​​{1}},但这很棘手,需要一些环顾四周

请查看此questionthis以了解有关此操作的详情。