视图作为用户控件或Windows

时间:2013-04-24 18:51:13

标签: .net wpf mvvm caliburn.micro

我是新手,因此可能是个白痴。那就是说,我希望我的观点是UC还是Windows?我猜这取决于我的使用场景,也许......

我有一个主视图,其中有“按钮”用于不同的操作,例如CreateThis或ModifyThat。当用户点击其中一个“按钮”时,我想在对话框类型场景中显示适当的视图。这个 SEEMS 就像它会成为一个窗口但是我不确定Window Manager如何影响这个。

此外,当我进行Winforms开发时,我制作了所有“视图”UC,我将嵌入一个可重复使用的窗口,以便它们更灵活,是否适用于此处?

有人指出我正确的方向吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我假设WPF,因为您提到了Window而不是ChildWindow,但通常您想创建UserControls

WindowManager会根据您是否致电ShowPopupShowDialogShowNotification自动确保您的内容显示在相应的容器中,以便让他们更好地使用灵活(实际上WindowManager设置WPF应用程序的初始窗口,为您的引导程序启动的任何ViewModel解析视图,并确保在视图不是窗口时创建窗口)

对于复合视图,您需要做的就是将子视图模型作为组合容器的属性(即将托管它们的另一个视图模型)包含在内,并使用ContentControl和CMs约定绑定它们< / p>

e.g。将显示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但听起来更像是在寻找复合视图,而不是工具窗口