Caliburn.Micro的分层导航模型

时间:2012-04-05 11:36:47

标签: c# .net wpf silverlight caliburn.micro

我想在WPF MVVM应用程序中实现以下分层导航模型:

ShellView
    Page1View
       Subpage1View
           Subpage2View
       Subpage3View
    Page2View
        ...

这意味着在Shellview上,我有按钮来激活/停用Page1View和Page2View。在Page1View上有按钮来激活Subpage1View和Subpage3View,Subpage1View有一个按钮来激活Subpage2View。

子页面应该显示在哪里?导航模型应该是否真实地映射到视图结构?我的意思是,我在ShellView上有一个ContentControl(名为ActiveItem),激活后会显示Page1View和Page2View。 Subpage1View应该显示在Shell的ActiveItem ContentControl上还是显示在父视图上(Page1View)?

  1. 如果我应该在ShellView上显示子页面,那么如何正确激活它?因为激活它的按钮位于Page1View上而不是shell上。

  2. 如果我应该在父视图(Page1View)上显示子页面,那么我必须在Page1View上创建一个ActiveItem ContentControl并在需要之前隐藏它。怎么样 ?另外我猜父视图滚动条可能会成为一个问题。

  3. 请指教!

    使用Caliburn.Micro 1.3,.NET 4,WPF。

    谢谢!

2 个答案:

答案 0 :(得分:2)

我一起举行了一个演示。我不确定它是不是你正在寻找的。需要记住的是ScreensConductors可以包含Screens和/或Conductors。因此,嵌套或执行复杂的屏幕组合非常简单。

此示例包含ShellView,其中包含2个按钮和ContentControlPage1ViewModel还有2个按钮和一个ContentControl

点击Page1Page2上的ShellView按钮会激活相应的Page。激活Page后也是如此,点击SubPage1SubPage2会激活相应的SubPage

https://bitbucket.org/dbeattie/cmwpfnavsample/src

答案 1 :(得分:1)

我们以这种方式使用子页面:

  • 子页面本身显示在页面视图中的ContentControl中。所以我们有一个shell视图,它有一个ContentControl来显示活动页面,在这个活动页面中,还有另一个ContentControl来显示活动子页面。
  • 我们在shell视图本身上显示当前页面的子页面列表(由于布局),因此我们将ItemsControl绑定到ActiveItem.Items(前提是ActiveItem是从Conductor继承的页面)。

因此,我们只需使用ItemsControl来选择当前活动的页面或子页面,然后使用ContentControl来显示它。请注意,所选子页面通过其父页面视图显示。

但基本上,您是否直接在shell视图上显示子页面(ContentControl绑定到ActiveItem.ActiveItem)或使用其他方式取决于您。

虽然不包含子页面,但Coproject示例应用程序可能会对您有所帮助。我打算让它更复杂,稍后再添加子页面。

ad 2.我认为您不需要隐藏ContentControl - 如果没有选择子页面,它将为空。不过,如果你想隐藏它,我建议使用ValueConverter(从object到Visibility,如果object == null,然后是Visibility.Collapsed,否则是Visible)并再次将ActiveItem ContentControl的Visibility属性绑定到ActiveItem。