2012-10-11 11 views
5

W mojej aplikacji WPF mam rodzaj wykresu węzłów. Dodałem ContextMenu do tych węzłów, który pojawia się, gdy klikam prawym przyciskiem myszy rzeczy i tak dalej.Opóźnienie RaiseCanExecuteChanged z ContextMenu

Polecenia w menu kontekstowym pochodzą z usługi (Microsoft.Practices.ServiceLocation.ServiceLocator) z usługą DelegateCommands, a te polecenia są aktualizowane przy użyciu RaiseCanExecuteChanged(). Węzeł, który został kliknięty prawym przyciskiem myszy, jest przekazywany do tej usługi polecenia, która jest używana w różnych metodach dla poleceń.

węzły mają pewne właściwości, które są wykorzystywane w takich warunkach, jak, czy może ona zostać zmieniona lub usunięta, itp

private void ContextMenu_ContextMenuOpening(object sender, RoutedEventArgs e) { 
     ServiceLocator.Current.GetInstance<IMenuCommandService>().ReloadICommandConditions(); 
    } 

w IMenuCommandService:

public void ReloadICommandConditions() { 
     ((DelegateCommand<Node>) MyCommand).RaiseCanExecuteChanged(); 
    } 

My ContextMenu (Wewnątrz DataTrigger & Setter):

<ContextMenu> 
    <MenuItem Header="Rename" 
       Command="{Binding MenuCommandService.Rename}" 
       CommandParameter="{Binding Node}" /> 
    <MenuItem Header="Delete" 
       Command="{Binding MenuCommandService.Delete}" 
       CommandParameter="{Binding Node}" /> 
    ... 
</ContextMenu> 

Mój problem polega na tym, że po kliknięciu prawym przyciskiem myszy jednego z tych węzłów wyświetlone menu kontekstowe wygląda tak, jak zostało skonfigurowane dla węzła poprzednio. Podobnie jak w przypadku kliknięcia prawym przyciskiem myszy węzła do usunięcia, a następnie węzła, którego nie można usunąć, polecenie "Usuń" w menu kontekstowym nadal będzie można kliknąć. (Jeśli kliknę prawym przyciskiem myszy węzeł niemożliwy do usunięcia, menu kontekstowe będzie wtedy poprawne, a polecenie "Usuń" będzie nieaktywne).

Wygląda na to, że istnieje pewne opóźnienie od momentu wprowadzenia zmian po RaiseCanExecuteChanged() jest tam, aby menu kontekstowe mogło "podnieść". Mogłem wykonać prostą poprawkę i wyświetlić tylko menu kontekstowe po ich zaktualizowaniu (tj. Zostały nazwane ich metody CanExecute), ale chciałbym, aby dwie części były względnie oddzielne.

Czy jest coś oczywistego, czego mi brakuje, czy podchodzę do tego w niewłaściwy sposób, czy też ktoś ma jakieś inne sugestie?

Dzięki

+0

Czy debugowałeś aż do CanExecute() któregokolwiek z poleceń i sprawdziłeś warunki tam? Nie sądzę, że jest to problem z opóźnieniem, ale będą to wartości warunku sprawdzane w CanExecute, na przykład currentSelectedNode lub coś podobnego. Może twój SelectedNode jest nadal poprzednim podczas wywoływania ContextMenuOpening? – KroaX

+0

@Kroax Parametr metody CanExecute() jest dostarczany przez ContextMenu: ''. Ten parametr jest podawany poprawnie, gdy klikane są rzeczywiste elementy w menu kontekstowym, ale nie są one wyświetlane po pierwszym otwarciu. – Pyritie

Odpowiedz

0

Sort-of-rozwiązany - Jestem teraz ręcznie przechodząc węzeł, który był prawym przyciskiem myszy na moich MenuCommandService dzięki tej metodzie ReloadICommandConditions(), i to trzyma lokalnego odniesienia do niego, która go potem używa zamiast parametru w jego metodach CanExecute(). Surowe, ale przynajmniej działa.

Zostawię to na razie na wypadek, gdyby ktoś wiedział o sposobie, który jest nieco bardziej ... elegancki.

Powiązane problemy