2010-12-10 55 views
3

我有一个Windows WPF应用程序,我在其中使用Caliburn.Micro。主窗口视图/视图模型由Caliburn.Micro处理。其中一个按钮弹出一个新的对话窗口,它使用不同的视图模型。包含两个Caliburn.Micro视图的对话框视图?

在这个对话框中,我有一个容器(列表框和一些过滤器控件),我想将它们制作为一个可重用的控件,以便将其包含在其他对话框中。为此,我从对话框的视图和视图模型中提取了相关的代码,并创建了一个新的视图和视图模型。这一切看起来不错。

问题是,现在回到对话框中,我有一个大的空白空间,我需要可重用的控制去的dockpanel。

从对话框viewmodel OnInitalize()我可以创建可重用的控件viewmodel,但我不知道如何将它的视图放到对话视图的dockpanel中。我们使用WindowManager()。ShowDialog()来显示对话框的视图模型,Caliburn.Micro负责设置视图。有没有一种方法可以在对话框的XAML中指定我想要嵌入可重用控件的视图并让Caliburn创建适当的视图/视图模型?

或者我正在错误的方式呢?

回答

8

如果您的对话框视图模型是另一个视图模型类型的属性,并且将ContentControl添加到与此属性命名相同的对话框视图中,则Caliburn.Micro会自动注入相应的视图将您的属性视图模型类型转换为ContentControl占位符,并将该视图模型类型自动绑定到视图。你是这个意思吗?喜欢的东西:

// Dialog View Model 
private MyReusableControlViewModel myReuseableControl; 
public MyReusableControlViewModel MyReuseableControl 
{ 
    get { return this.myReuseableControl; } 
    set { this.myReuseableControl = value; NotifyOfPropertyChanged(...); } 
} 

// Dialog View Model Constructor 
public DialogViewModel() 
{ 
    this.MyReuseableControl = new MyReusableControlViewModel(); 
} 

// Dialog View 
<DockPanel> 
    ... 
    <ContentControl x:Name="MyReusableControl" /> 
</DockPanel> 

当然,理想情况下,你将要注入的对话视图模型(在这种情况下MyReusableControlViewModel)和工作对抽象任何依赖该对话框视图模型里面,而不是具体类型。

+0

这听起来像我正在寻找的东西,我会试试看。 – DaveK 2010-12-13 15:30:15

+0

完美的作品,谢谢! – DaveK 2010-12-13 21:41:59

+0

花了几个小时试图弄清楚,然后我找到了答案。非常感谢,解决方案比我想象的要简单得多。 – 2012-04-27 01:29:04