所以,我期待在Caliburn.Micro中创建一个简单的布局,但我对如何做的事情感到有些困惑。
目标布局如下所示:
_______________________________________
| | |
| | |
| | |
| NAV | MAIN |
| | |
| | |
| | |
|___________|__________________________|
从我正在阅读的许多教程中,应该有一个通常称为Shell
的根视图模型,该模型派生自Conductor
并使用{{1}激活Main
视图}}。到现在为止还挺好。但是如果ActivateItem()
本身就是一个视图,而不仅仅是一些带按钮的堆栈面板呢?我尝试了以下方法:
Nav
导航视图加载完全正常。但现在我有几个问题:
我该如何发出信号,例如点击按钮直到## ShellViewModel
public class ShellViewModel : Conductor<IScreen>, IShell {
private IScreen _navigationScreen;
public IScreen NavigationScreen {
get { return _navigationScreen ?? (_navigationScreen = new NavigationViewModel()); }
}
}
## ShellView
<Window...
<ContentControl x:Name="NavigationScreen" />
<ContentControl x:Name="ActiveItem />
</Window>
,以便更改ShellViewModel
?通过ActiveItem
(真的,只为一个按钮为所有感兴趣的处理程序播放一个事件?)?
为什么视图模型(EventAggregator
)需要关心布局?为组合/布局设置某种路由器不是更好吗?
依赖注入怎么样?假设Shell
需要一个文件阅读器,因为它加载(我知道,愚蠢的例子)它是一个文件中的导航项?由于我是在NavigationViewModel
中自己创建的,因此我需要引用它甚至不属于的依赖项。或者是Shell
是某种神类,只是为了将它们传递给独立的观点而引用每一种依赖?
我很遗憾找不到任何关于Caliburn的教程,这些教程不仅仅是婴儿步骤和简单的视图构成,但从我到目前为止所知,这一切似乎都与DI等没有尊重。或者我遗失了什么?
答案 0 :(得分:0)
DI非常适用,当然它取决于您选择的容器,MEF,大多数样品都有它,SimpleContainer(烘焙)。有一些适用于所有其他容器的Bootstrappers实现(StructureMap,Windsor,Ninject等),内置有一个静态IoC类,用于在引导程序之外的容器中获取已注册的对象,但我觉得有些意愿这也说它具有过多使用它的反模式倾向,仅在绝对必要时才使用。
告诉视图切换当前活动,即使示例基于&#34;对话框&#34 ;; Hello Screens确实显示了这是如何完成跨视图模型(即shell到工作空间)它可能是该子弹点的最佳答案
至于构图,根据您想要的复杂程度,有些会使用自定义导体。我倾向于使用KISS方法,只有当我觉得它值得时才分开进入模块。 EventAggregator
对于跨视图模型通信非常方便。如果您打算使用当然合成Conductor<>
是一个不错的选择,也可以实现视图切换,或者Conductor
和多视图单视图模型设计的组合。
public class ShellViewModel : Conductor<IScreen>, IShell
{
//INavigationViewModel is a "service interface" to the actual implimentation
private INavigationViewModel _navmodel
public class ShellViewModel(INavigationViewModel navmodel){
_navmodel = navmodel;
}
}
//can be done as long as NavigationViewModel is in the container of your choosing
在您的NavigationViewModel中,您可能会使用IConductor
接口之类的东西来告诉Shell上的指挥,有一个新的活动项目要处理..
请记住,CM首先是视图模型,但确实能够先进行视图查看,并且全部都在配置中。选择一个不要混合作为建议,混合导致奇怪的行为。
HTHS