3

複合 WPF アプリケーションがあります。ツールバー機能を実装する予定です。メイン領域のすべてのビューに共通するツールバー項目 (基本的には、印刷、保存、非表示、展開、元に戻す) はほとんどありません。このために、これらの項目 (印刷、保存、非表示、展開、元に戻す) をツールバー領域に追加するデフォルトのツールバー モジュールを作成しました。ユーザーが任意のツールバー項目をクリックすると、メイン領域の 20 個のビューすべてでこれを処理する必要があります。

ツールバー項目ごとに、プリズム デリゲートコマンド オブジェクトを関連付けました。

サンプル:

private ICommand _printCommand;

public ICommand PrintCommand
{
    get
    {
        if (_printCommand == null)
        {
            _printCommand = 
                new DelegateCommand<object>(**Print**, **CanPrint**);                    
        }

        return _printCommand;
    }
}

Xaml、ツールバー項目をこのコマンドにバインドします。

メイン リージョンでは、20 近くのビューが表示されます。これらのビューはすべて、このコマンドをサブスクライブする必要があります。イベント アグリゲーターを使用してイベントを発行することを考えています。すべてのビューがこのイベントをサブスクライブします。

例: ユーザーが印刷をクリックすると、印刷コマンドは、印刷イベントを発行するPrintメソッドを実行します。このイベントは 20 回のビューでサブスクライブされ、さらに処理が行われます。

ツールバーを正しい方法で実装していますか?

4

4 に答える 4

2

最初は、複合コマンドを使用することを考えていました。しかし、ドキュメントを確認すると、私の要件に合わない場合があります。

例 : アプリケーションは 40 個のビューをサポートします メイン領域 -> アクティブな 20 個のビュー、すべてのビュー モデルは baseviewmodel から派生します。

ツールバー -> 保存ボタン -> compositesaveall コマンドへのデータバインディング (activeaware モニターが有効) baseviewmodel -> 保存コマンド -> 特定のフィルター条件に基づいて、compositesaveall コマンドへの登録/登録解除

ユーザーが保存ボタンをクリックすると、compositesaveallcommand はアクティブなすべての登録済みコマンドを検索し、登録済みのすべてのビューモデル コマンド呼び出し (canexecute メソッド、およびすべての登録済みコマンドは true を返す必要がある) をチェックしてから、子コマンド ( execute メソッド) を呼び出します。

しかし、私の場合、ユーザーが単一のビューで変更を加えた場合、残りの 19 個のビューには変更がありません。しかし、シングルビューの保存を実行したいと思います。複合コマンドは、すべてを実行できない限り、登録されたコマンドを呼び出さないようです。

于 2010-02-12T10:02:33.873 に答える
2

アプリケーションでユーザーが複数のコマンドを同時に実行できる場合、リボン ボタンで表される単一のコマンドを使用して、ユーザーがすべての項目を異なるタブに保存できるようにすることができます。この場合、[すべて保存] コマンドは、各アイテムのビュー モデル インスタンスによって実装された各保存コマンドを呼び出します。たとえば、株式トレーダー RI では、次のコード例に示すように、各売買注文の Submit および Cancel コマンドは、SubmitAllOrders および CancelAllOrders 複合コマンドに登録されます (OrdersController クラスを参照)。

commandProxy.SubmitAllOrdersCommand.RegisterCommand(
                    orderCompositeViewModel.SubmitCommand );
commandProxy.CancelAllOrdersCommand.RegisterCommand(
                    orderCompositeViewModel.CancelCommand );

上記の commandProxy オブジェクトは、静的に定義された Submit および Cancel 複合コマンドへのインスタンス アクセスを提供します。詳細については、クラス ファイル StockTraderRICommands.cs を参照してください。

public class MyViewModel : NotificationObject
{
    private readonly CompositeCommand saveAllCommand;

    public ArticleViewModel(INewsFeedService newsFeedService,
                            IRegionManager regionManager,
                            IEventAggregator eventAggregator)
    {
        this.saveAllCommand = new CompositeCommand();
        this.saveAllCommand.RegisterCommand(new SaveProductsCommand());
        this.saveAllCommand.RegisterCommand(new SaveOrdersCommand());
    }

    public ICommand SaveAllCommand
    {
        get { return this.saveAllCommand; }
    }
}
于 2011-04-27T10:42:34.117 に答える
1

これはまさにCompositeCommandが行うことです。例はないと思いますが(Commanding QuickStartまたはRIはアクティブアウェアアクティビティを表示しなくなり、Prism v1で表示されました)、アクティブアウェアのものを使用すると、求めているものが得られます。唯一のことは、個々のDelegateCommandのそれぞれが必要なときに(つまり、ビューがアクティブになったときに)IsActiveプロパティが正しく更新されることを確認する必要があるということです。

于 2010-02-18T21:22:36.653 に答える
0

このようなことに EventAggregator を使いすぎるという考えはあまり好きではありません。特に、マルチ ドキュメント エディター インターフェイスを作成することにした場合、各エディターは、自分にのみ適したイベントを取得するために多くのフィルター処理を行う必要があります。

この目的で EventAggregator を使用するのは簡単かもしれませんが、おそらく実際には適切ではないと思います。そうは言っても、それは本当に間違っているわけではありません... 実際、いくつかの Prism サンプルはまさにこれを行っていると思いますが、フレームワーク機能を活用するのではなく、構成要素にフィルタリングの責任を負わせすぎていると思います。

あなたの件名は、これに CompositeCommands を使用することを考えていたことを示唆しています。EventAggregator を使用する代わりにこれを行っていない理由はありますか? ViewModel がこれらのボタンのそれぞれを処理するように設計されたコマンドを登録し、各ボタンの背後にある複合コマンドを使用できる標準的な場所があれば、それで必要な機能が得られると思いませんか? ボタン コマンドを処理できることに加えて、各構成要素のビュー/ビューモデルは、ボタンが不適切な場合などにボタンを無効にすることができます。

Prism のドキュメントにある CompositeCommand のサンプルをよく見て、希望どおりに動作しないかどうかを確認してください。

于 2010-02-11T21:57:10.770 に答える