簡體   English   中英

DataGrid Row的Caliburn.Micro和ContextMenu

[英]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以便它發送冒泡到它的動作消息,以便它們到達DataGridDataContext ,但這很棘手,需要一些環顧四周。

看看這個問題這個,以了解更多關於這樣做的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM