5

私の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つの部分を比較的分離したままにしておきたいと思います。

私が見逃している明らかな何かがありますか、私はこれを間違った方法で行っていますか、または誰かが他の提案をしていますか?

ありがとう

4

1 に答える 1

0

解決済みの並べ替え -- 現在、右クリックされたノードをMenuCommandServiceそのメソッドを介して手動で渡しています。ノードへReloadICommandConditions()のローカル参照が保持されており、CanExecute() メソッドのパラメーターの代わりに使用されます。 . 粗雑ですが、少なくとも機能します。

誰かがもう少しエレガントな方法を知っている場合に備えて、今のところこれを開いたままにします。

于 2012-10-12T10:55:01.940 に答える