0

アドバイスをお願いします。

私が取り組んでいるアプリケーションには がありdocking control、さまざまな「ドキュメント」の操作をサポートする必要があります。windowsしたがって、同時に複数の (タブ) を開くことができます。

それぞれが異なるコンテンツをホストできます。私が参照した "ドキュメント" は、テキスト ファイル、Excel スタイル シート、またはこのアプリが開発されているメイン コントロール (地理データの視覚化) である可能性があります。

MVVMパターンと MVVM Light ライブラリを使用しています。注: Excel スプレッドシート用のサード パーティ コントロールがあります。

これで、「保存」、「切り取り」、「コピー」などの共通の(in ) / ボタン (in )がある amenu barと aができました。タブを切り替えると、「保存」ボタンで適切な保存機能。toolbarmenuitemsmenubartoolbar

同じことがカット/コピー/ペーストにも当てはまります:

  • テキスト ドキュメントのタブにある場合 - 切り取り/コピー/貼り付けはテキストで動作する必要があります (これには wpf 組み込みコマンドがあります)。

  • メイン コントロールの場合 - グラフィック要素で動作するはずです (これらを実装する必要があります)。

  • スプレッドシートの場合 - 同封のスプレッドシート コントロール用のサード パーティ コマンドで動作するはずです。

さらに、いくつかのテキストが選択されているタブがある可能性があります。したがって、このタブに切り替えたときに切り取り/コピー用のメニュー項目/ボタンを有効にする必要がありますが、他のタブにはグラフィック要素が選択されていないため、切り取り/コピー用のメニュー項目/ボタンを有効にする必要があります。このタブに切り替えると無効になります。

保存commandを使用すると、それを行う 1 つの可能な方法を想像できますが、それでも、それを実装する良い方法であるかどうかはわかりませんRelayCommand

public ICommand SaveCommand
{
    get
    {
        if (_saveCommand == null)
        {
            _saveCommand = new RelayCommand(() => this.SaveFile());
        }
        return _saveCommand;
    }
}

メソッドは、タブSaveFile()の他の「保存メソッド」を呼び出します(これは、「ドキュメント」タイプに応じたビューモデルになります)。datacontextselected

ただし、保存ボタン/メニュー項目を有効/無効にする方法がわかりません。また、さまざまな切り取り/コピー/貼り付け機能を実現する方法もわかりません。

質問が長くなってしまい申し訳ありません。たぶん、私はちょうど尋ねたかもしれません:

「アプリケーションのどの部分が選択/アクティブになっているかに応じて、さまざまな切り取り/コピー/貼り付けコマンドをボタンにバインドするにはどうすればよいですか?」.

しかし、私が達成しようとしていることの追加のコンテキストが質問に答えるのに役立つと感じました.

4

1 に答える 1

2

SaveFile() メソッドは、選択されたタブのデータコンテキストで他の「保存メソッド」を呼び出します (これは、「ドキュメント」タイプに応じたビューモデルになります)。

SaveFile は、View に戻らずに ViewModel によって実装する必要があります。

さまざまな種類のドキュメントを表すいくつかの ViewModel を作成し、それぞれに保存機能を実装させます。

コマンドの CanExecute メソッドをビューで使用して、メニュー項目またはボタンを有効にするかどうかを決定できます。必要なのは、ViewModel に CanExecute メソッドを実装することだけです。ほとんどの場合、Save コマンドの CanExecute は IsDirty または同様のプロパティを使用します。

編集

コンテキスト/アクティブなタブ項目に対応する必要があるメニュー項目の場合、メニューのコマンドと ViewModel のコレクション (タブ項目ごとに 1 つ) を含むメインの ViewModel を作成できます。

コンテキスト アウェア メニュー項目のコマンド ハンドラーで、アクティブな ViewModel を取得し、コマンドを渡します。

現在の TabItem を取得するには、SelectedItem をメインの ViewModel のプロパティにバインドします (プロパティの型は、ViewModel の基本クラスである可能性があります)。

そうすれば、現在のタブ項目を取得するためにビューに戻る必要はありません。

于 2013-07-01T14:27:09.193 に答える