假设我有一个包含许多较小组件的组件,这些组件在初始化第一个组件之前检查先决条件。它们不相互依赖,所以我不关心顺序,希望它们同时运行。我正在使用 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 - 这可能导致错误。继续?”) - 这应该是可能的。
但我只想一次只看到一个窗口。除了同步进行之外,我将如何做到这一点?
编辑 - 因为这个问题似乎太模糊了
我需要这些 Actions 专门运行后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)viewmodel 请求它并且 b)当时没有其他先决条件窗口打开时才创建视图。
注意:此处的代码仅用于说明,因为我还不确定如何实现此行为。我对这些框架(和概念)没有经验,所以如果这个问题看起来很愚蠢,请多多包涵。