在我的WPF應用程序中,我有一種節點圖。我爲這些節點添加了一個ContextMenu
,這些節點在我右鍵單擊東西時出現,等等。使用ContextMenu的RaiseCanExecuteChanged延遲
上下文菜單中的命令來自服務(Microsoft.Practices.ServiceLocation.ServiceLocator
)和DelegateCommands
,並且這些命令更新爲RaiseCanExecuteChanged()
。右鍵單擊的節點被傳遞給此命令服務,該命令服務在各種命令的CanExecute
方法中使用。
節點都具有一些性質,這是在這些條件下使用的,例如是否可以重命名或刪除等
private void ContextMenu_ContextMenuOpening(object sender, RoutedEventArgs e) {
ServiceLocator.Current.GetInstance<IMenuCommandService>().ReloadICommandConditions();
}
在IMenuCommandService
:
public void ReloadICommandConditions() {
((DelegateCommand<Node>) MyCommand).RaiseCanExecuteChanged();
}
我的文本菜單(內部的DataTrigger
& Setter
):
<ContextMenu>
<MenuItem Header="Rename"
Command="{Binding MenuCommandService.Rename}"
CommandParameter="{Binding Node}" />
<MenuItem Header="Delete"
Command="{Binding MenuCommandService.Delete}"
CommandParameter="{Binding Node}" />
...
</ContextMenu>
我的問題是,當我右鍵單擊其中一個節點時,顯示的上下文菜單看起來像它已配置爲以前的節點所選。就像如果我右鍵單擊一個可刪除節點然後是一個不可刪除節點,上下文菜單上的「刪除」命令仍然是可點擊的。 (如果我然後右鍵單擊不可刪除的節點,則上下文菜單將正確,「刪除」命令將變灰)。
因此,看起來像是在修改後發生某種延遲RaiseCanExecuteChanged()
實際上是爲contextmenu「拾取」的。我可以做一個粗略的修正,只顯示更新後的contextmenu(即他們的CanExecute
方法已被調用),但我想保持兩個部分相對獨立。
有沒有什麼明顯的我錯過了,我以錯誤的方式去解決這個問題,還是有人有任何其他的建議嗎?
感謝
你有沒有經過調試,直到你的任何命令的CanExecute(),並檢查那裏的條件?我不認爲這是一個延遲問題,但它會成爲您在CanExecute中檢查的條件值,例如currentSelectedNode或其他東西。在調用ContextMenuOpening時,您的SelectedNode是否仍然是前一個? – KroaX
@Kroax CanExecute()方法的參數由ContextMenu提供:'。點擊了contextmenu中的實際項目時,此參數可以正確提供,但在第一次打開時不會顯示。 – Pyritie