我在 WPF 应用程序中使用 ViewModel-first 方法使用 Caliburn.Micro (CM)。我正在用命令栏和活动项目组成主视图。主 viewModel 设置命令栏 viewModel 的属性,并正确导航到活动项目。
运行时一切看起来都很好,问题是only与设计时相关:主视图在设计器中显示为空,我找不到如何正确设置它。我设法让它在其他场景中工作,例如在设计时为整个 Window 或 UserControl 设置数据上下文时,即当它是 XAML 中的根 UI 元素时。但现在我无法对窗口中的子 ContentPresenter UI 元素执行此操作。
这是摘录主视图我正在作曲:
<Window x:Class="...MainView" ...>
<DockPanel ...>
<!-- this one binds to a property of type CommandBarViewModel -->
<ContentControl x:Name="CommandBar" ... />
<ContentControl x:Name="ActiveItem" ... />
</DockPanel>
</Window>
我检查了一些相关的读物,但似乎没有一个适合/解决我的问题。这个问题 https://stackoverflow.com/questions/14536306/how-to-leverage-designer-when-using-a-viewmodel-first-approach-and-composition和我的基本一样,但是没有答案。这有一个参考这另一个问题 https://stackoverflow.com/questions/9107635/how-to-use-designinstance-with-caliburn-micro在我看来,这是一种视图优先的方法,从cal:View.Model
绑定。
我尝试添加如下设计时上下文(fake
为简洁起见,未显示命名空间):
<ContentControl x:Name="CommandBar" ...
d:DataContext="{d:DesignInstance Type=fake:DesignTimeCommandBarViewModel, IsDesignTimeCreatable=True}"
cal:Bind.AtDesignTime="True"/>
但后来我遇到了两种情况之一:
if 设计时间命令栏视图模型继承自实际命令栏视图模型,然后我遇到了设计时与依赖注入的常见问题:默认构造函数为所有注入的依赖项传递 null,而基本构造函数或其他东西会出现问题。我的意思是,似乎需要付出一些努力才能找到解决方法,并且just for设计时支持
if 设计时间命令栏视图模型不从实际的 viewModel 继承,那么似乎(正确地)CommandBarView 没有实例化,因为现在 viewModel 和该视图之间不再有任何关系。
你对此有什么想法吗?也许这应该通过托管 MainViewModel 的设计时版本来解决?
我查过的其他参考资料:这个答案来自 Rob Eisenberg 本人 https://stackoverflow.com/questions/9997226/caliburn-micro-getting-it-to-bind-usercontrols-in-a-mainview-to-their-viewmodels, 这个CM话题 http://caliburnmicro.codeplex.com/discussions/267231, 这另一个SO https://stackoverflow.com/questions/9580325/does-caliburn-micro-play-nicely-with-user-controls
Edit
按照我最后的(自动)提示,我还尝试创建并实例化一个设计时主视图模型, not继承自主视图模型,它公开相同的属性并设置设计时间命令栏视图模型在其默认构造函数中。在这种情况下,设计器显示了经典的 CM 抱怨,而不是命令栏:找不到 DesignTimeCommandBarViewModel 的视图。
下一步是什么?