2016-04-27 10 views
1

私のWPFアプリケーションには、デフォルトでコマンドバインディングを持たないいくつかのボタンが含まれているツールバーがあります。アプリケーション内では、さまざまな異なるフォーム/ウィンドウを開くことができます(MDIと考える)。これらのビューのそれぞれは、コマンドをツールバーボタンに適用する共有ユーティリティに登録する責任があります。ビューモードでオブジェクトのメソッド呼び出しをトリガーするには

ツールバーと他の標準的なUIの部分は、ビューとは別のライブラリに存在し、私が言及した共有ユーティリティは、ビューにボタンをフックする唯一のインターフェイスです。ここではビューはこの機能は保存とsearchignのように、すべてのバックエンド・タスクのために偉大な働いている

public class MyView : BaseView 
{ 
    public MyView(CommandHolder commandHolder) : base(commandHolder) 
    { 
     SaveCommand = new DelegateCommand(Save,CanSave); 

     //RegisterCommand is a method on BaseView that works with the commandHolder object 
     RegisterCommand(DefaultCommands.SaveCommand, SaveCommand); 
    } 
} 

コマンドに登録する方法の使用例はあるが、今は私が存在している機能をトリガできるようにする必要があることがわかりますこれらのコマンドのいずれかからのビュー内にあります。

ここで具体的な例は、ツールバーのExcelにエクスポートボタンがあり、グリッドのデータに基づいてxlsxファイルを生成したいということです。

私はDevExpress社のコントロールを使用していますが、そのグリッドには、次のメソッド呼び出しをサポートしています。

//taken from xaml code behind 
grid.ExportToXlsx(@"c:\grid_export.xlsx"); 

は私のコマンドのいずれかの方法でのviewmodelにへの参照を与えるこのコールのショートを誘発することができるようにする方法を実行してあります見る?

+1

すべてのコマンドが行う場合は、そのメソッドを呼び出すと、ViewModelでコマンドを作成する必要はなくなります。コードビハインドのクリックイベントハンドラはうまくいきます。 ViewModelコマンドで心臓を設定していれば、Prism EventAggregatorのようなイベント/メッセージングパターンを使用できます。 –

+0

その問題は最初の部分で説明しようとしたことです。ボタン自体は、このメソッドを呼び出す必要があるビューとはまったく別物です。コマンドは文字通り唯一のオプションです。 – Phaeze

+0

@GlenThomasもう少し追加しましたうまくいけばそれをクリアする説明 – Phaeze

答えて

1

プリズムには、アプリケーションのコンポーネント間の疎結合通信用のEventAggregatorコンポーネントがあります。

CompositePresentationEventを継承するクラスを作成します。ジェネリック型を使用すると、インスタンスは、関連するコンポーネント間で共有されるように、Singletonパターンやお好みのIoCコンテナを使用してイベントアグリゲータを作成してペイロード

public class ExportRequestedEvent : CompositePresentationEvent<object> { } 

として使用したいすべてのデータの種類です。コマンドで

IEventAggregator _aggregator = new EventAggregator(); 

は、購読方法

_aggregator.GetEvent<ExportRequestedEvent>().Subscribe(Export); 

private void Export() 
{ 
    grid.ExportToXlsx(@"c:\grid_export.xlsx"); 
} 

を使用してイベントを処理するために、あなたがメソッドを登録することができ、イベントを取得するためにイベントアグリゲータを使用して、あなたのビューで

_aggregator.GetEvent<ExportRequestedEvent>().Publish(null); 

を公開しますビューに独自の機能を追加して、どのビューが現在アクティブで、イベントに対応するかを判断できます。

関連する問題