1

私はここでCaliburnMicroのドキュメントを調べていました。同時に、私は実験のためにいくつかの大まかなコードを作成しようとしていました。コンテナを使用してアイテムをアクティブ化する方法と、アクティブ化するViewModelにオブジェクトを渡す方法について少し混乱しています。

マスター/詳細シナリオを考えてみましょう。マスターにはリスト(たとえばdatagrid)が含まれ、詳細には更新用のマスターからの特定の行(たとえばタブコントロール内のタブアイテム)が含まれます。ドキュメント(理解を容易にするため)では、ViewModelの詳細は次のようなコードを使用して直接インスタンス化されたと思います

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive {
int count = 1;

public void OpenTab() {
    ActivateItem(new TabViewModel {
        DisplayName = "Tab " + count++
    });
}
}

したがって、上記の基本的な概念を実際のアプリに適用するには、コンテナー(たとえばMEF)を使用してDetailViewModel(上記のTabViewModel)をインスタンス化する必要があります。その場合の課題は、特定のDetailViewModelがTABコントロールですでに開かれているかどうかを知ることです。私が頭に浮かんだのは、開いているタブのリスト(DetailViewModels)を維持することでした。しかし、その後、MasterViewModelでDetailViewModelを再度参照し、目的を無効にします。この問題を解決するために利用できるオプションはありますか?

私を悩ませている2番目のことは、MasterViewModel(選択された詳細アイテム)からDetailViewModelにオブジェクトを渡す方法です。ここでEventAggregatorを使用すると、開いたDetailViewModelのそれぞれが、処理方法がわからないイベントを受け取ります。

誰かが上記の2つの問題に光を当てることができれば、私は感謝します

更新: マスターはこのような指揮者です

public class MainViewModel : Conductor<IScreen>.Collection.OneActive, IShell {
    ....
}

そして詳細はこのように定義されています

public class TabViewModel : Screen {
    ....
}

両方が同じウィンドウにあります。

4

1 に答える 1

1

問題が何であるか正確にはわかりません。あなたの多くの指揮者には、ItemsCaliburn.Micro が提供するコレクションがあります。詳細ビューを表示するときは、このコレクションにその詳細ビューが存在するかどうかを確認できます (マスター ビューから取得した主キーを使用)。

項目が既にItemsコレクションにある場合は、(ActivateItemメソッドを使用して) アクティブ化するだけです。項目がコレクションにない場合は、それをインスタンス化し (MEF を使用している場合はおそらくファクトリを使用)、Itemsコレクションに追加してからアクティブ化します。

于 2012-11-13T11:16:17.750 に答える