내 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
메서드가 호출되었지만), 두 부분을 상대적으로 분리하고 싶습니다.
분명치 않습니까? 제가 잘못 생각한 것입니까? 잘못된 길로 가고 있습니까? 아니면 다른 제안이 있습니까?
감사
명령의 CanExecute()가 끝날 때까지 디버그하고 거기에서 조건을 확인 했습니까? 나는 이것이 지연 문제라고 생각하지 않지만, 예를 들어 currentSelectedNode와 같은 CanExecute에서 체크 한 조건 값이 될 것입니다. ContextMenuOpening을 호출 할 때 SelectedNode가 여전히 이전 것입니까? – KroaX
@Kroax CanExecute() 메소드의 매개 변수는 ContextMenu에 의해 제공됩니다 :''. 이 매개 변수는 상황에 맞는 메뉴의 실제 항목을 클릭 할 때 올바르게 제공되지만 처음 열 때 표시되지는 않습니다. – Pyritie