![](/img/trans.png)
[英]Caliburn.Micro ListBox with ContextMenu No Target Found
[英]Caliburn.Micro and ContextMenu for DataGrid Row
我在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()
被執行並且第一次一切正常,但是單擊其他行上的菜單項會對第一次顯示ContextMenu
行執行SomeMethod()
。
我在CM的ActionMessage.cs
源代碼中添加了一些斷點,發現第一次單擊鼠標右鍵顯示菜單調用事件調用ElementLoaded()
方法,后者又調用UpdateContext()
。 因此,為菜單項創建了上下文(它是RowViewModel
) ,但在其他行上調用上下文菜單時從不重新分配它。
您應該利用Action Messages的冒泡功能來更輕松,更優雅地處理這個問題。
不要在每個RowViewModel
實例上放置SomeMethod()
,而應該將它放在DataGrid
本身的DataContext
上,然后更改SomeMethod()
簽名,這樣我就可以將RowViewModel
作為參數,這當然是每行的DataContext
,所以現在它看起來像這樣SomeMethod(RowViewModel rowViewModel)
然后在XAML中使用cal:Message.Attach="SomeMethod($dataContext)"
。
在那之后你應該配置ContextMenu
以便它發送冒泡到它的動作消息,以便它們到達DataGrid
的DataContext
,但這很棘手,需要一些環顧四周。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.