我假设 WPF 因为你提到Window
而不是ChildWindow
,但通常你想创建UserControls
.
WindowManager
根据您是否调用自动确保您的内容显示在适当的容器中ShowPopup
,ShowDialog
或者ShowNotification
使它们成为 UC 使事情变得更加灵活(实际上WindowManager
为 WPF 应用程序设置了初始窗口,为您的引导程序开始的任何 ViewModel 解析视图并确保在视图还不是窗口的情况下创建一个窗口)
至于复合视图,您需要做的就是将您的子视图模型作为复合容器的属性(即另一个将托管它们的视图模型)并使用 aContentControl
和 CMs 约定绑定它们
例如,将显示 2 个 UC 的 VM 可能如下所示:
public class SomeCompositeViewModel : Screen
{
public SomeOtherViewModel SomeOtherView { get; set; } // You probably want INPC here as per usual
public YetAnotherViewModel YetAnotherView { get; set; }
public SomeCompositeViewModel()
{
// Setup as you need - direct instantiation, IoC/DI, use MEF, whatever works for you
SomeOtherView = new SomeOtherViewModel();
YetAnotherView = new YetAnotherViewModel();
}
}
和 XAML
<UserControl x:Class="SomeAssembly.Yadda.Yadda.SomeComposititeViewModel">
<StackPanel>
<!-- Bind to SomeOtherViewModel via the SomeOtherView property etc -->
<ContentControl x:Name="SomeOtherView" />
<ContentControl x:Name="YetAnotherView" />
</StackPanel>
</UserControl>
(布局更有创意,不是吗!)
如果您希望所有项目都具有生命周期,则可以使用Conductor<T>.Collection.AllActive
,但听起来更像是在寻找复合视图,而不是工具窗口