私のWPFアプリケーションには、一種のノードグラフがあります。これらのノードにを追加しましたContextMenu
。これは、ものを右クリックすると表示されます。
コンテキストメニューのコマンドは、サービス(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>
私の問題は、これらのノードの1つを右クリックすると、表示されるコンテキストメニューが、前に選択したノード用に構成されたように見えることです。削除可能なノードを右クリックしてから削除不可能なノードを右クリックした場合と同様に、コンテキストメニューの[削除]コマンドは引き続きクリック可能です。(次に、削除できないノードを右クリックすると、コンテキストメニューが正しくなり、[削除]コマンドがグレー表示されます。)
RaiseCanExecuteChanged()
したがって、コンテキストメニューが「ピックアップ」するために、後で行われた変更が実際にそこにあるときから、ある種の遅延があるように見えます。大まかな修正を行って、更新された後(つまり、CanExecute
メソッドが呼び出された後)にのみコンテキストメニューを表示することもできますが、2つの部分を比較的分離したままにしておきたいと思います。
私が見逃している明らかな何かがありますか、私はこれを間違った方法で行っていますか、または誰かが他の提案をしていますか?
ありがとう