2012-03-07 6 views
1

プリズムを使用してWPFアプリケーション内の別のViewModelsから1つのコマンドを何らかの方法で実行できますか?異なるViewModelsから同じプリズムコマンドを実行

私は何を意味するか説明しましょう。

私はMainMenuViewModelクラスを持っている:

public class MainMenuViewModel 
{ 
    private ICommand _aboutCommand; 
    public ICommand AboutCommand 
    { 
     get 
     { 
      if (_aboutCommand == null) 
      { 
       _aboutCommand = new DelegateCommand(() => 
        { MessageBox.Show("About menu item clicked!"); }); 
      } 

      return _aboutCommand; 
     } 
    } 
} 

もこのモデルのビューがあります:

<Menu IsMainMenu="True"> 
    <MenuItem Header="Nápověda"> 
     <MenuItem Header="O Aplikaci" x:Name="About" 
        Command="{Binding AboutCommand}" /> 
    </MenuItem> 
</Menu> 

同じ動作でコマンドを実行する必要があるアプリケーション内の別のモジュールがあり、 (またはおそらくより良い - 同じコマンド):

public class MunisatorViewModel 
{ 
    private ICommand _aboutCommandInAnotherModule; 

    public ICommand AboutCommandInAnotherModule 
    { 
     get 
     { 
      if (_aboutCommandInAnotherModule== null) 
      { 
       _aboutCommandInAnotherModule= new DelegateCommand(() => 
        { MessageBox.Show("About menu item clicked!"); }); 
      } 

      return _aboutCommandInAnotherModule; 
     } 
    } 
} 

このモジュールには表示:

<StackPanel Background="White" HorizontalAlignment="Center" VerticalAlignment="Top"> 
    <Button cmd:Click.Command="{Binding AboutCommandInAnotherModule}">About</Button> 
</StackPanel> 

重複するコードを避けることはできますか?

P.S.私は、この2つのViewModelの基本クラスを作成し、そこにこのコマンドを記述できることを理解していますが、ViewModelのいくつかはすでに異なる基本クラスを持っているという問題があります。

答えて

2

EventAggregatorを使用して、このようなイベントを発生させます。これにより、UIのさまざまな領域間の通信を疎結合させることができます。

CompositeEventオブジェクトを実装することによってデータを渡すパブリッシュ/サブスクライブの概念がうまく機能します。

また、コマンドを静的にして別の領域からアクセスすることもできますが、これはすばらしくないようです。

Prism documentation詳しくは、詳細をご確認ください。

希望に役立ちます。

+0

私はEventAggregatorについて知っていますが、重複したコードを避けるためにこの状況では役立ちません。 – msi

+0

はい、そうです... MainMenuViewModelはaboutメニューを表示するためのコードを実装します。また、AboutCommandFiredというイベントにサブスクライブし、MunisatorViewModelがそのイベントを公開します。 MainMenuViewModelでは、匿名メソッドから実装を移動して、DelegateCommandとイベントアグリゲータの両方から呼び出すこともできます。 – lecrank

+0

しかし、この場合でも、コマンドを作成するためのコードを複製し、異なるコマンドをビューに割り当てる必要があります。私の質問は、別のビューのSAMEコマンド実装を使用することが可能な場合でした。 – msi

0

あなたのAboutCommandを別のクラス/オブジェクトにリファクタリングして、両方のビューモデル(コンストラクタ、セッタなど)に注入できる可能性があります。このように、すべてのビューモデルは単にコマンドオブジェクトへの参照を提供するだけで、メインビューモデルからのAboutCommandロジックを「アウトソーシングする」代償としてコードが重複します。

もう1つ静的な方法として、AboutCommandなどのCompositeCommandsを含むコマンドプロキシを使用することができます。どこでも、あなたはaboutコマンドの(または複数の)実装を登録できます。

これが役に立ちます。

関連する問題