【问题标题】:Views as User Controls or Windows作为用户控件或窗口的视图
【发布时间】:2013-04-18 11:20:05
【问题描述】:

我对此很陌生,因此可能是个白痴。也就是说,我希望我的视图是 UC 还是 Windows?我猜这取决于我的使用场景,也许......

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

另外,当我进行 Winforms 开发时,我将所有“视图”UC 都嵌入到一个可重复使用的窗口中,这样它们就更灵活了,这适用吗?

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

【问题讨论】:

    标签: .net wpf mvvm caliburn.micro


    【解决方案1】:

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

    WindowManager 会根据您调用 ShowPopupShowDialogShowNotification 自动确保您的内容显示在适当的容器中,因此使它们成为 UC 会使事情变得更加灵活(实际上是 WindowManager 集启动 WPF 应用程序的初始窗口,解析引导程序以哪个 ViewModel 开始的视图,并确保在视图还不是窗口时创建窗口)

    对于复合视图,您需要做的就是将您的子视图模型作为复合容器的属性(即另一个将托管它们的视图模型)并使用 ContentControl 和 CM 约定绑定它们

    例如将显示 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&lt;T&gt;.Collection.AllActive,但这听起来更像是您在寻找复合视图,而不是工具窗口

    【讨论】:

    • 谢谢,我没有意识到窗口管理器为我做了这么多的工作。另外,如果可能的话,我会奖励奖励积分,以回答我什至没有想过要问的问题。当然是指复合视图。最棒的,谢谢。出于好奇,您继承的 Screen 是什么?
    • Screen 是 CM 的默认实现 IScreen - 一个公开生命周期功能的接口,例如激活、停用、优雅关闭等 - 它还继承了包含 INPC 功能的 PropertyChangedBase。要使用导体,最好使用 IScreen 接口作为 CM 中的导体实现,以便在执行窗口时找到此实现的接口,以便使它们通过正确的生命周期步骤(您可以沿着实现 IActivate 的路线走, IDeactivate、IGuardClose 等你自己,但为什么要重新发明轮子!)
    • 哦,是的,IViewAware + 视图缓存也由 Screen 实现 - 这些很有用(如果你想做一些操作,你可以从 VM 获取视图的引用 - 我并不是说您应该将视图作为已知类型进行操作,但也许您想编写一个辅助类,该类为特定类型的控件查找可视化树,以使其不可见或类似的东西)
    • 谢谢,我不知道Screen。我真的很喜欢 CM,但发现缺少文档令人失望,也许我找错地方了,但我发现只有 CodePlex 网站上部分完成的东西是最新的。
    • 我认为 CodePlex 网站上的文档非常好 - 他们会引导您完成设置以及框架的几乎所有方面 - 有很多要阅读的内容,但都很有用。学习曲线很浅,因此您可以在几周内掌握它
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多