2012-10-11 4 views
5

내 WPF 애플리케이션에 노드 그래프가 있습니다. 이 노드에 ContextMenu을 추가했습니다.이 노드는 물건을 마우스 오른쪽 버튼으로 클릭 할 때 나타납니다.ContextMenu를 사용한 RaiseCanExecuteChanged 지연

컨텍스트 메뉴의 명령은 DelegateCommands 인 서비스 (Microsoft.Practices.ServiceLocation.ServiceLocator)에서 가져오고 해당 명령은 RaiseCanExecuteChanged()으로 업데이트됩니다. 마우스 오른쪽 버튼으로 클릭 된 노드는이 명령 서비스로 전달되며,이 명령 서비스는 다양한 CanExecute 명령에 사용됩니다.

노드 모두가 등이 이름을 바꾸거나 삭제 될 수 있는지 여부와 같은 이러한 조건에서 사용되는 일부 속성,

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

:

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

내의 ContextMenu (내부 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() 실제로 "픽업"컨텍스트 메뉴가 있습니다. 나는 조잡한 수정을 할 수 있었고 컨텍스트 메뉴가 업데이트 된 후에 만 ​​(즉, 그들의 CanExecute 메서드가 호출되었지만), 두 부분을 상대적으로 분리하고 싶습니다.

분명치 않습니까? 제가 잘못 생각한 것입니까? 잘못된 길로 가고 있습니까? 아니면 다른 제안이 있습니까?

감사

+0

명령의 CanExecute()가 끝날 때까지 디버그하고 거기에서 조건을 확인 했습니까? 나는 이것이 지연 문제라고 생각하지 않지만, 예를 들어 currentSelectedNode와 같은 CanExecute에서 체크 한 조건 값이 될 것입니다. ContextMenuOpening을 호출 할 때 SelectedNode가 여전히 이전 것입니까? – KroaX

+0

@Kroax CanExecute() 메소드의 매개 변수는 ContextMenu에 의해 제공됩니다 :''. 이 매개 변수는 상황에 맞는 메뉴의 실제 항목을 클릭 할 때 올바르게 제공되지만 처음 열 때 표시되지는 않습니다. – Pyritie

답변

0

해결 정렬 - 중 - - 지금은 수동으로 마우스 오른쪽 버튼으로 클릭하는 ReloadICommandConditions() 방법을 통해 내 MenuCommandService에 있던 노드를 통과하고있어, 그것은 그것의 로컬 참조를 잡고 다음 어떤을 CanExecute() 메서드에서 매개 변수 대신 사용합니다. 조잡한,하지만 적어도 작동합니다.

누구나 좀 더 우아하고 우아한 방법을 알고있는 경우에 대비하여 공개하도록하겠습니다.

관련 문제