0

MVVM (私が初めて使用するパターン) を使用して開発しようとしている複雑なアプリケーションがあります。アプリケーションにはタブとドッキングされたウィンドウがあり、それぞれに「選択されたオブジェクト」の概念があり、上部にグローバル ツールバーがあります。 「選択したオブジェクト」に作用する必要があるアクションを持つアプリケーションの。

たとえば、Visual Studio に似たものの少し単純なバージョンを想像してみてください。

  • 選択したオブジェクトが「非アクティブ」なリスト ビューを含むペインが選択されている場合は、[アクティブ化] ツールバー項目が有効になっている必要があります。(グローバルに選択されたアイテムは、そのリスト ビュー アイテムです)
  • ただし、ユーザーがオブジェクトを選択していない別のペインのタブをクリックすると、同じツールバー項目が無効になります (グローバルに選択された項目は null です)。

現時点では、複数選択などの複雑さを無視して、「アプリケーション」自体を表す包括的なシングルトン*モデルクラスを作成することでこれを実装しました。

class MyAppModel : INotifyPropertyChanged
{
    public ISelectableObject SelectedObject { get; }
}

次に、UI の変更がグローバルの変更につながる場合に、このプロパティが更新される (および関連するイベントが発生する) ことを確認するための "システム" (ここでは多くの詳細を省略していることを認めます) を用意します。現在選択されているオブジェクト」であり、ツールバーのボタンはこのプロパティを使用して可用性などを決定します...

ただし、これがMVVMのように見えないという事実に夢中になっています(UIの状態をViewModelに保存する必要があることをどこかで読みましたか?)

  • このように「アプリケーション」を表すグローバル モデルを持つことは良い考えですか? (開いているドキュメントなど、アプリケーション内の他のものを同様の方法で追跡するための他のプロパティもあります)
  • そうでない場合、グローバル コンポーネント (ツールバーのアイテムなど) が「グローバルに選択されたオブジェクト」が何であるかを見つけて追跡できるようにするために、代わりに何を使用する必要がありますか?

(*) 依存性注入を使用して簡単に提供できます

4

2 に答える 2

0

なぜなら、あなたは間違いなくあなたのトップレベルのバインディングサーフェスを表すMVVMマスターを持っているべきです。そのマスターはの通知に参加するプロパティを持っています。次に、関連するItemsControl(s)(など)をこのプロパティにバインドする必要があります。そうすると、アプリの他の部分がViewModelsプロパティにバインドでき、バインドが自動的に変更されます。ViewModelViewsViewModel'SelectedItem'INotifyPropertyChangedViewModelTabControlSeledctedItemViewModelSelectedItem

于 2012-06-01T11:45:15.957 に答える
0

Inputmanager.current の PreNotifyInput イベントを登録してみてください。これをアプリケーションレベルでこのイベントをグローバルレベルに登録します。

InputManager.Current.PreNotifyInput += new NotifyInputEventHandler(Current_PreNotifyInput);

Inputmanager クラスも参照してください

http://msdn.microsoft.com/en-us/library/ms617136

于 2012-06-01T12:26:13.163 に答える