2012-10-11 31 views
5

在我的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方法已被調用),但我想保持兩個部分相對獨立。

有沒有什麼明顯的我錯過了,我以錯誤的方式去解決這個問題,還是有人有任何其他的建議嗎?

感謝

+0

你有沒有經過調試,直到你的任何命令的CanExecute(),並檢查那裏的條件?我不認爲這是一個延遲問題,但它會成爲您在CanExecute中檢查的條件值,例如currentSelectedNode或其他東西。在調用ContextMenuOpening時,您的SelectedNode是否仍然是前一個? – KroaX

+0

@Kroax CanExecute()方法的參數由ContextMenu提供:'。點擊了contextmenu中的實際項目時,此參數可以正確提供,但在第一次打開時不會顯示。 – Pyritie

回答

0

排序 - 的 - 解決 - 我現在手動傳遞,這是右鍵單擊通過ReloadICommandConditions()方法上我MenuCommandService的節點,它所持有的本地引用它,它然後使用它的CanExecute()方法代替參數。原油,但至少它工作。

我會保持這種狀態,以防萬一有人知道這種方式更加優雅。