1

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

4

1 回答 1

3

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

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

之后,您应该配置它,ContextMenu以便它向它发送冒泡的操作消息,以便它们到达的DataContextDataGrid但这很棘手,需要环顾四周。

查看this questionthis以了解有关执行此操作的更多信息。

于 2013-08-13T09:06:58.917 回答