最初のコンポーネントが初期化される前に、前提条件をチェックする多数の小さなコンポーネントを含むコンポーネントがあるとします。それらは互いに依存していないので、順序は気にせず、同時に実行したいと考えています。プレゼンテーションには MEF と Caliburn.Micro を使用しています。
私はこの設定について考えました:
class Big
{
[ImportMany]
public IEnumerable<IBigPrerequisite> Prerequisites {get; set;}
public void Initialize(){...}
}
と
interface IBigPrerequisite
{
public bool IsBusy {...}
public bool Allow {...}
public void StartChecking();
}
これで私が達成したいのは、実装するクラスIBigPrerequisite
がウィンドウを開くことができるということです (たとえば、「ファイル X が見つかりませんでした - これはエラーにつながる可能性があります。続行しますか?」) - これは可能であるはずです。
しかし、一度に表示できるウィンドウは 1 つだけにしたいと思います。同期するだけでなく、どうすればそれを達成できますか?
編集 - 質問があいまいすぎるように見えたので
これらのアクションをBig
アクティブにする前に具体的に実行する必要があります。アクティベーション ロジックを次のように切り替えたとします。
Big big; //we got this through Importing somewhere in composition
var allow = true;
var count = 0;
if(!pre.Any()) //no prerequisites, show window immediately
windowManager.ShowWindow(big)
foreach(var pre in big.Prerequisities)
{
pre.PropertyChanged += (s, args) =>
{
if(args.PropertyName == "IsBusy" && !pre.IsBusy) // if a prerequisite finished it's check
{
allow = allow && pre.Allow; //if one prerequisite says nay we could just return, actually...
count++;
if(count == big.Prerequisites.Count() && allow)
windowManager.ShowWindow(big);
}
}
pre.StartChecking();
}
ここで、実装するクラスIBigPrerequisite
がウィンドウを開くことができるようにすることを明示的に望んでいますが、すべての前提条件が満たされている場合 (ユーザーの操作は必要ありません)、ウィンドウは表示されません。ここでは、すべてのクラスのウィンドウを開きたくありません。
私は、たとえば、IBigPrerequisite (おそらくIPrerequisiteViewModel
とにかく呼び出す必要があります) に次のようなプロパティを与え、 bool RequestsWindow {get;}
a) ビューモデルがそれを要求し、b) 他の前提条件ウィンドウが開いていない場合にのみビューを作成する方法を探しています。
注: この動作を実装する方法がまだわからないため、ここのコードは説明用です。私はこれらのフレームワーク (および概念) の経験がないので、この質問がばかげていると思われる場合は、ご容赦ください。