2009-05-10 2 views
0

私は、ユーザーがデータをブラウズできるようにするアプリケーションを作成しています.FirefoxのUIスタイルを使用したいと思います。 。私はまた、できるだけModel-View-ViewModelパターンを使ってこれをやろうとします。MVVMとウィンドウリスト

新しいタブを開くことは、MVVMで処理するのに十分なほど簡単です。 TabViewModelのObservableCollectionを作成し、そのコレクションをTabControlのItemsSourceにバインドして、新しいTabViewを開くことは理論的には新しいTabViewModelをコレクションに追加するのと同じくらい簡単です。

ここに私に興味のある質問があります:新しいウィンドウを開くために同じことをする方法はありますか?つまり、WindowViewModelのObservableCollectionをItemsSource ...のアプリケーションのWindowsコレクションにバインドするのですか?...新しいWindowViewModelをobservableコレクションに追加すると、新しいウィンドウが自動的に開きますか?そしてStartupUriを設定するのではなく、最初のWindowViewModelをコレクションに追加するだけです。

私は実際にデータバインドApplication.Windowsは、何がへのViewModel層のための最善の方法だろうことはできませんので、新しいWindowViewModelを追加し、新しいウィンドウが自動的に表示されてい

  1. を。
  2. WindowViewModelを削除し、そのウィンドウを自動的に閉じるようにします。
  3. ユーザーがウィンドウを閉じると、コレクションからWindowViewModelを削除します。

私はINotifyCollectionChangedを監視し、開く/コレクション・イベントに応答してウィンドウを閉じ、自分自身のオブジェクトを書くことができますが、私はそれが最善の方法だかどうかはわからない - それがある場合、私はわかりませんそれをアプリケーションにフックする最善の方法を教えてください。誰でもこれについて最善の方法を考えている?

答えて

0

MVVMのポイントは、ViewModelにがビュービューモデルの変化にどう反応するかで(詳細に)自分自身を心配する必要がないこと、です。

一つの可能​​性は、外出先でのWindowsの作成と破棄、ViewModelにでて、CollectionChangedイベントを聴いビューで、単純な追跡アルゴリズムのようになります。

Dictionary<WindowModel, WindowView> _cache = new; 
void WindowModelListChangedHandler(sender, args) { 
    switch(args.Action) { 
     case Add: 
      _cache[args.NewItem] = new WindowView(args.NewItem); 
      _cache[args.NewItem].Show(); 
      break; 
     case Remove: 
      // ... 
    }  
}